pip install pyppeteer
爬取http://quotes.toscrape.com/js/ 所有頁面數據\html
import asyncio from pyppeteer import launch from lxml import etree async def main(): browser = await launch() page = await browser.newPage() await page.goto('http://quotes.toscrape.com/js/') page_text = await page.content() tree = etree.HTML(page_text) div_list = tree.xpath('//div[@class="quote"]') print(len(div_list)) await browser.close() asyncio.get_event_loop().run_until_complete(main())
運行結果:10
解釋:launch 方法會新建一個 Browser 對象,而後賦值給 browser,而後調用 newPage 方法至關於瀏覽器中新建了一個選項卡,同時新建了一個 Page 對象。而後 Page 對象調用了 goto 方法就至關於在瀏覽器中輸入了這個 URL,瀏覽器跳轉到了對應的頁面進行加載,加載完成以後再調用 content 方法,返回當前瀏覽器頁面的源代碼。而後進一步地,咱們用 pyquery 進行一樣地解析,就能夠獲得 JavaScript 渲染的結果了。在這個過程當中,咱們沒有配置 Chrome 瀏覽器,沒有配置瀏覽器驅動,免去了一些繁瑣的步驟,一樣達到了 Selenium 的效果,還實現了異步抓取,爽歪歪!python
browser = await launch(headless=False, args=['--disable-infobars'])
處理頁面顯示問題:訪問淘寶首頁web
import asyncio from pyppeteer import launch async def main(): browser = await launch(headless=False) page = await browser.newPage() await page.goto('https://www.taobao.com') await asyncio.sleep(10) asyncio.get_event_loop().run_until_complete(main())
發現頁面顯示出現了問題,須要手動調用setViewport方法設置顯示頁面的長寬像素。設置以下:瀏覽器
import asyncio from pyppeteer import launch width, height = 1366, 768 async def main(): browser = await launch(headless=False) page = await browser.newPage() await page.setViewport({'width': width, 'height': height}) await page.goto('https://www.taobao.com') await asyncio.sleep(3) asyncio.get_event_loop().run_until_complete(main())
import asyncio from pyppeteer import launch width, height = 1366, 768 async def main(): browser = await launch(headless=False) page = await browser.newPage() await page.setViewport({'width': width, 'height': height}) await page.goto('https://movie.douban.com/typerank?type_name=%E5%8A%A8%E4%BD%9C&type=5&interval_id=100:90&action=') await asyncio.sleep(3) # evaluate能夠返回js程序的返回值 dimensions = await page.evaluate('window.scrollTo(0,document.body.scrollHeight)') await asyncio.sleep(3) print(dimensions) await browser.close() asyncio.get_event_loop().run_until_complete(main())
import asyncio from pyppeteer import launch async def main(): browser = await launch(headless=False, args=['--disable-infobars']) page = await browser.newPage() await page.goto('https://login.taobao.com/member/login.jhtml?redirectURL=https://www.taobao.com/') await page.evaluate( '''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''') await asyncio.sleep(10) asyncio.get_event_loop().run_until_complete(main())
await self.page.setUserAgent('xxx')
import asyncio from pyppeteer import launch async def main(): # headless參數設爲False,則變成有頭模式 browser = await launch( headless=False ) page = await browser.newPage() # 設置頁面視圖大小 await page.setViewport(viewport={'width': 1280, 'height': 800}) await page.goto('https://www.baidu.com/') # 節點交互 await page.type('#kw', '周杰倫', {'delay': 1000}) await asyncio.sleep(3) await page.click('#su') await asyncio.sleep(3) # 使用選擇器選中標籤進行點擊 alist = await page.querySelectorAll('.s_tab_inner > a') a = alist[3] await a.click() await asyncio.sleep(3) await browser.close() asyncio.get_event_loop().run_until_complete(main())
import asyncio from pyppeteer import launch from lxml import etree async def main(): # headless參數設爲False,則變成有頭模式 browser = await launch( headless=False ) page1 = await browser.newPage() # 設置頁面視圖大小 await page1.setViewport(viewport={'width': 1280, 'height': 800}) await page1.goto('https://www.toutiao.com/') await asyncio.sleep(2) # 打印頁面文本 page_text = await page1.content() page2 = await browser.newPage() await page2.setViewport(viewport={'width': 1280, 'height': 800}) await page2.goto('https://news.163.com/domestic/') await page2.evaluate('window.scrollTo(0,document.body.scrollHeight)') page_text1 = await page2.content() await browser.close() return {'wangyi': page_text1, 'toutiao': page_text} def parse(task): content_dic = task.result() wangyi = content_dic['wangyi'] toutiao = content_dic['toutiao'] tree = etree.HTML(toutiao) a_list = tree.xpath('//div[@class="title-box"]/a') for a in a_list: title = a.xpath('./text()')[0] print('toutiao:', title) tree = etree.HTML(wangyi) div_list = tree.xpath('//div[@class="data_row news_article clearfix "]') print(len(div_list)) for div in div_list: title = div.xpath('.//div[@class="news_title"]/h3/a/text()')[0] print('wangyi:', title) tasks = [] task1 = asyncio.ensure_future(main()) task1.add_done_callback(parse) tasks.append(task1) asyncio.get_event_loop().run_until_complete(asyncio.wait(tasks))
爬取結果:app
toutiao: 「央視快評」堅守初心 爲國奉獻
toutiao: 南航一A380客機北京降落時遭冰雹風擋現裂痕 已平安降落無人受傷
toutiao: 美國正開啓第二戰場:圍獵中國高科技企業 |「雙線做戰」戰略意圖
toutiao: 雲南省陸良縣:農民給供銷社打「白條」
toutiao: 媒體:90後副縣長若非靠拼爹上位 需拿出業績服衆
toutiao: 南航A380飛北京客機遭遇冰雹襲擊,擋風玻璃全碎
toutiao: 祕魯北部發生7.8級地震
toutiao: 1958年,由捷克斯洛伐克援建的北京電影洗印廠曾爲全國行業的老大
toutiao: 一箭60星,發射成功!馬斯克衛星互聯網計劃啓動
69
wangyi: 中美經貿摩擦背後:有人在幹,有人在騙
wangyi: 華爲迴應個別標準組織撤銷資格:產品服務不受影響
wangyi: 隔空約架?中方主播劉欣23年前就贏得國際演講比賽
wangyi: 從錢學森到任正非 中國教育有多少底氣應對全球化
wangyi: 2個月內二度履新 35歲清華博士任安徽省直單位領導
wangyi: 南陽「水氫發動機汽車」引熱議 官方迴應四大疑問
wangyi: 31歲北大博士躋身縣委常委 主筆6萬字全縣發展規劃
wangyi: 幹部退休15年後投案自首 省委巡視辦:頭一次碰到
wangyi: 臺灣被標註"中國臺灣省" 臺外事部門要求更正被拒
wangyi: 190天3次現場辦公!南陽領導爲什麼鍾愛青年汽車項目less