本节内容主要是介绍用python中pyppeteer库去测试采集微信搜狗中公众号内容,用于我们日常seo素材使用。pyppeteer实际上是一个内置chrome浏览器,和selenium库相似。今天用pyppeeteer去测试采集公众号内容。
设置常规变量
获取搜狗微信地址,浏览器对象,屏幕分辨率和超时时间,抓取页面数
创建浏览器对象
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()
调用主函数运行代码,这样就实现了微信搜狗公众号的内容的抓取了,这个库抓取数据还是挺方便的。需要源码可以关注!私信发源码。
,