相信很多业余学习的小伙伴们开始接触python爬虫技术时,都被它深深的吸引了,上手简单,见效快,一个text=urllib.request.urlopen('xxxx').read().decode('utf-8)就可以抓到网页的代码内容,通过正则提取自己想要的部分并保存到自己想要的地方去,成就感油然而生,心中萌生出各种伟大的项目。。。。。。
2017年11月23日正式开始自学python,买到了一本《python基础教程》第二版开始了python之旅,12月10日买了本《精通Python网络爬虫》和《精通Scrapy网络爬虫》两本书,这三本书基础教程只看了基础语法,数据类型,定义函数和类,异常处理,精通python网络爬虫只看了多线程实例,精通Scrapy一页都没有翻开,通过自己的学习感悟,给比我还新的新人一点点自学建议,对于零基础的,建议买本基础的工具书把基础语法,数据类型,定义函数学懂再去上手
此博客是本人人生中第一篇博客,比较激动,废话较多,上正题,自学的小伙伴们如果有兴趣可以加我qq互相督促学习进步哈。
正题:python3.6 协程 异步爬虫实现 及 爬取资源到数据库
1,为提高爬取的效率,我们会用到多线程,多进程,协程。关于多进程和多线程网上的概念及用法太多太多,不多啰嗦。关于协程如何实现,首先要用到asyncio和aiohttp模块,asyncio模块用于定义协程函数,启动协程。
定义协程函数用 async def xxx 和 await ,启动协程用loop=asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(tasks)) (tasks是一个asyncio.ensure_future(协程函数(参数))的列表,相当于多任务,异步执行tasks里的所有任务)或者loop=asyncio.get_event_loop() future=asyncio.ensure_future(协程函数(参数)) loop.run_until_complete(future) 相当于一个任务,调用一次协程函数
2,爬虫时间阻塞主要在对服务器发送请求和接收请求,对抓取的函数我们用异步,那么支持异步的抓取的模块,用aiohttp。至于用法,照猫画虎就好,举个栗子:(这个例子是 根据一个关键词为入口在wap.sogou.com上抓取 搜索相关 的关键词并存入数据库 根据搜索相关的关键词再去搜索得到搜索相关关键词,无限循环)
async def run(url,urlq,kwdq2):
headers={'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Encoding':'gb2312,utf-8',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0',
'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Connection':'Keep-alive'
} #headers信息,一般包含User-Agent就可以
try:
async with aiohttp.ClientSession() as session:
aiohttp.Timeout(1) #设置超时时间
async with session.get(url,headers=headers) as response: #相当于response=urllib.request.urlopen(url)