标题 [原创]Python—异步爬取腾讯新闻
本人由于一直仰慕程序员,今年在下乡扶贫的过程中,通过网络自学了Python语言的一些基本知识,由于完全是自学,连一本教材都没有的情况下,在粗略的学完基础知识后,就信马由缰的学起了爬虫.同时也就常年在这个坛子里下潜.向各位高人学习.这两天潜心学习了异步协程的相关知识,就拿QQ新闻练了一下手,想把代码和爬取一些感想发在这里,希望能得到大神们的指点!这段文字也就全当前言了吧.异步爬取QQnews
通过一步步的学习爬取的相关知识,我学会了如何发送同步请求,了解了urllib.request、urllib.parse/reqests/等等相关库的知识,也先后以类和面向对象的形式写了同步爬虫.通过在网上了解到<font color=#999AAA
一、分析QQnews_html.
我没有学过网页制作的相关知识,只是在自学中知道了什么是动态网页和静态网页如何区分以及抓取端口,具体的理论知识,我说不了太多。下面就准备上代码.求大神们的指点了.
二、使用步骤
1.引入库
代码如下(示例):
import asyncio
import aiohttp
from fake_useragent import UserAgent
import random
from parsel import Selector
import json
import os
2.读入数据
代码如下(示例):
if not os.path.exists('./qqnews/'):
os.mkdir('./qqnews/')
temp_url = 'https://i.news.qq.com/trpc.qqnews_web.kv_srv.kv_srv_http_proxy/list?sub_srv_id=24hours&srv_id=pc&offset={}'
ua = UserAgent()
headers = {
'user-agent': str(ua.random),
'referer': ' https://news.qq.com/',
}
async def main(url):
async with aiohttp.ClientSession()as session:
try:
async with session.get(url=url, headers=headers)as resp:
print(resp.status, resp.charset)
html_data = await resp.text()
each_data = json.loads(html_data)
# print(each_data)
each_url = each_data['data']
for r in each_url['list']:
deail_task = {
'title': r['title'],
'href': r['url'],
'create_time': r['create_time'],
'img': r['img']
}
await asyncio.create_task(get_next_request(session, deail_task))
except Exception as e:
print(e)
asyncio.sleep(3)
async def get_next_request(session, deail_task):
try:
async with await session.get(url=deail_task['href'], headers=headers)as response:
each_news_data = await response.text()
sel = Selector(each_news_data)
content = sel.css('.content-article p::text')
if content:
deail_task['contents'] = '\n'.join(content.getall())
else:
deail_task['contents'] = '无正文'
print(deail_task)
with open('./qqnews/'+deail_task['title']+'.txt', 'a', encoding='utf8')as fp:
fp.write(deail_task['title'])
fp.write(deail_task['create_time'])
fp.write(deail_task['href'])
fp.write(deail_task['contents'])
fp.write(deail_task['img'])
fp.write('\n')
except Exception as e:
pass
if __name__ == '__main__':
for page in range(0, 120, 20):
url = temp_url.format(
page)+'&limit=20&strategy=1&ext={%22pool%22:[%22top%22],%22is_filter%22:7,%22check_type%22:true}'
asyncio.run(main(url))
该处使用的url网络请求的数据。
总结
提示:这里对文章进行总结:
看到总结,那就在说两句,这是我第一次在这种高手如云的坛子里发帖子,如有不妥之处,还请大家海涵.赐教/指导.
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。