本节内容主要是介绍用python中pyppeteer库去测试采集微信搜狗中公众号内容,用于我们日常seo素材使用。pyppeteer实际上是一个内置chrome浏览器,和selenium库相似。今天用pyppeeteer去测试采集公众号内容。

设置常规变量

python爬虫神技教学(pyppeeteer库爬取seo文章很好用)(1)

获取搜狗微信地址,浏览器对象,屏幕分辨率和超时时间,抓取页面数

创建浏览器对象

async def init(): global browser,page browser = await launch(headless=False,ignoreHTTPSErrors=True,args=['--disable-infobars',f'--window-size={WINDOW_WIDTH},{WINDOW_HEIGHT}']) page = await browser.newPage() await page.setViewport({'width': WINDOW_WIDTH, 'height': WINDOW_HEIGHT})

创建浏览器对象时,设置浏览器是否为无头模式,默认True是无头模式,忽略https验证ignoreHTTPSErrors,args中一个是无痕模式,另一是设置浏览器窗口大小

抓取页面信息

比如我们抓取和'seo'相关的文章。设置参数,请求url:https://weixin.sogou.com/weixin?page=2&query=seo&type=2

async def scrapy_index(page): params = { 'page':page, 'query':'seo', 'type':'2' } query_string = urlencode(params) page_url = INDEX_URL query_string await scrapy_html(page_url)

async def scrapy_html(url): logger.info(f'开始爬取{url}') try: await page.goto(url) await asyncio.sleep(2) await page.waitForSelector('img',options={'timeout':TIME_OUT*1000}) return True except TimeoutError: logger.error(f'请求的页面url出错{url}')

waitForSelector默认等待img元素出现,由于列表页元素和详情页元素都有共同的img元素,只要等待这个元素加载出来,页面信息就加载出来了

抓取详情页URL

async def parse_page(): return await page.querySelectorAllEval('.news-box .txt-box h3 a','nodes=>nodes.map(node=>node.href)')

详情页的url根据CSS选择器一步步的往下选择,返回详情页url列表。

解析详情页

async def parse_detail(): await asyncio.sleep(1) url = page.url title = await page.querySelectorEval('h1','node=>node.innerText') author = await page.querySelectorEval('#js_name','node=>node.innerText') ldate = await page.querySelecotorEval('#publish_time','node=>node.innerText') try: content = await page.querySelectorEval('#js_content section','node=>node.innerText') except: content = await page.querySelectorEval('#img-content', 'node=>node.innerText') content = '\n'.join(content.split()) return { 'url':url, 'title':title, 'author':author, 'ldate':ldate, 'content':content }

用querySelectorEval方法获取具体数据,第一个参数是selector,获取CSS选择器,第二个是要执行的js方法。

保存数据

async def save_json(data): RESULT_DIR = 'results' exists(RESULT_DIR) or makedirs(RESULT_DIR) name = data.get('title') data_path = f'{RESULT_DIR}/{name}.json' json.dump(data,open(data_path,'w',encoding='utf-8'),ensure_ascii=False,indent=2)

创建目录,并保存数据为json。

主函数运行

async def main(): await init() try: for page in range(1,TOTAL_PAGE 1): await scrapy_index(page) detail_urls = await parse_page() logger.info(f'获取详情页列表是{detail_urls}') print(detail_urls) for detail_url in detail_urls: flag = await scrapy_detail(detail_url) print(flag) if flag: data = await parse_detail() await save_json(data) finally: await browser.close()

python爬虫神技教学(pyppeeteer库爬取seo文章很好用)(2)

调用主函数运行代码,这样就实现了微信搜狗公众号的内容的抓取了,这个库抓取数据还是挺方便的。需要源码可以关注!私信发源码。

,