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