今天学习总结下爬取今日头条江歌案的新闻,今天头条用到了Ajax技术,所以用传统的索取网页元素的方法是获取不到内容的,之前我写了篇爬取拉钩上海Python职位信息,有兴趣的可以点开看看!
简书站外图片不能上传了么?上一篇的拉钩爬虫也是图片上传失败......大家有兴趣的可以去我博客,博客链接在最下面
第一步
用Chrome打开网页https://www.toutiao.com/search/?keyword=%E6%B1%9F%E6%AD%8C,打开开发者工具,红框内的信息是我们需要的,我们要抓取的数据就在data一栏中
[图片上传失败...(image-2b5cd5-1513863080036)]
我们再观察下网页信息,把网页不断的忘下翻,可以看到第一页是offset=0,往下翻过一个节点就是20,40,60这样递增上去
[图片上传失败...(image-bf43a2-1513863080036)]
好了,基本的分析完了,准备动手写代码
# -*- coding:utf-8 -*-
import requests
from urllib.parse import urlencode
from requests.exceptions import RequestException
def get_data():
data = {
'offset': 0,
'format': 'json',
'keyword': '江歌',
'autoload': 'true',
'count': '20',
'cur_tab': 1,
'from':'search_tab'
}
# urlencode(data)就是链接的解析
url = 'https://www.toutiao.com/search_content/?' + urlencode(data)
response = requests.get(url)
try:
if response.status_code == 200:
return response.text
return None
except RequestException:
print('data is error')
return None
def main():
html = get_data()
print(html)
if __name__ == '__main__':
main()
运行下代码,返回了这样的数据
[图片上传失败...(image-8a70f-1513595350490)]
第二步
解析数据
我们可以看下data一栏下的网页数据
[图片上传失败...(image-d10b02-1513863080036)]
def parse_data(html):
data = json.loads(html) # JSON 字符串解码为 Python 对象
if data and 'data' in data.keys():
news_list =[]
for item in data.get('data'):
news = {
'title': item.get('title'), # 使用get()方法避免了部分keys不存在时报错
'url': item.get('url'),
}
news_list.append(news)
return news_list
解析后再次运行代码,这就是我们要的数据了
[图片上传失败...(image-b26291-1513863080036)]
第三步
可以爬下单页数据了,现在来看下怎么爬取多页面
第一步网页分析的时候,offset的数据是抓取多页面内容的关键,我们先创建一个配置文件config.py,再创建多进程调用map方法
GROUP_START = 1
GROUP_END = 20
groups = [x * 2 for x in range(GROUP_START, GROUP_END + 1)]
pool = Pool(8)
pool.map(main, groups)
pool.close()
pool.join()
print('ALl is done!')
最后运行代码,开启了多进程后爬取的效率可以说是坐了火箭
[图片上传失败...(image-200d36-1513863080036)]
完整代码在GitHub
GitHub
简书
欢迎访问我的博客Treehl的博客
最后放一个爬虫集合,是我最近学习Python写的,喜欢的亲!给个Star呗!!!
SpiderList