Python爬虫实战,Scrapy实战,爬取知乎表情包
Posted 楚_阳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python爬虫实战,Scrapy实战,爬取知乎表情包相关的知识,希望对你有一定的参考价值。
前言
今天我们就用scrapy爬取知乎表情包。让我们愉快地开始吧~
开发工具
Python版本:3.6.4
相关模块:
scrapy模块
请求模块;
fake_useragent模块;
以及一些python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
原理简介
原理其实蛮简单的,因为之前就知道知乎有个api一直可以用:
https://www.zhihu.com/node/QuestionAnswerListV2
post请求这个链接,携带的数据格式如下:
data = {
\'method\': \'next\',
\'params\': \'{"url_token":%s,"page_size":%s,"offset":%s}\'
}
1. url_token:
问题id,譬如问题“https://www.zhihu.com/question/302378021”的问题id为302378021
2. page_size:
每页回答的数量(知乎最大只能是10)
3. offset:
当前显示的回答的偏移量
就可以获得该问题下的所有答案啦,然后用正则表达式提取每个回答下的所有图片链接就OK了。
具体实现的时候用的scrapy,先新建一个scrapy项目:
scrapy startproject zhihuEmoji
然后在spiders文件夹下新建一个zhihuEmoji.py文件,实现我们的爬虫主程序:
\'\'\'知乎表情包爬取\'\'\'
class zhihuEmoji(scrapy.Spider):
name = \'zhihuEmoji\'
allowed_domains = [\'www.zhihu.com\']
question_id = \'302378021\'
answer_url = \'https://www.zhihu.com/node/QuestionAnswerListV2\'
headers = {
\'user-agent\': \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/79.0.3945.130 Safari/537.36\',
\'Accept-Encoding\': \'gzip, deflate\'
}
ua = UserAgent()
\'\'\'请求函数\'\'\'
def start_requests(self):
offset = -10
size = 10
while True:
offset += size
data = {
\'method\': \'next\',
\'params\': \'{"url_token":%s,"page_size":%s,"offset":%s}\' % (self.question_id, size, offset)
}
self.headers[\'user-agent\'] = self.ua.random
yield scrapy.FormRequest(url=self.answer_url, formdata=data, callback=self.parse, headers=self.headers)
\'\'\'解析函数\'\'\'
def parse(self, response):
# 用来保存图片
if not os.path.exists(self.question_id):
os.mkdir(self.question_id)
# 解析响应获得问题回答中的数据, 然后获取每个回答中的图片链接并下载
item = ZhihuemojiItem()
answers = eval(response.text)[\'msg\']
imgregular = re.compile(\'data-original="(.*?)"\', re.S)
answerregular = re.compile(\'data-entry-url="\\\\\\\\/question\\\\\\\\/{question_id}\\\\\\\\/answer\\\\\\\\/(.*?)"\'.format(question_id=self.question_id), re.S)
for answer in answers:
item[\'answer_id\'] = re.findall(answerregular, answer)[0]
image_url = []
for each in re.findall(imgregular, answer):
each = each.replace(\'\\\\\', \'\')
if each.endswith(\'r.jpg\'):
image_url.append(each)
image_url = list(set(image_url))
for each in image_url:
item[\'image_url\'] = each
self.headers[\'user-agent\'] = self.ua.random
self.download(requests.get(each, headers=self.headers, stream=True))
yield item
\'\'\'下载图片\'\'\'
def download(self, response):
if response.status_code == 200:
image = response.content
filepath = os.path.join(self.question_id, str(len(os.listdir(self.question_id)))+\'.jpg\')
with open(filepath, \'wb\') as f:
f.write(image)
其中ZhihuemojiItem()用于存储我们爬取的所有图片链接和对应的回答id,具体定义如下:
class ZhihuemojiItem(scrapy.Item):
image_url = scrapy.Field()
answer_id = scrapy.Field()
文章到这里就结束了,感谢你的观看,关注我每天分享Python爬虫实战系列,下篇文章分享大众点评爬虫。
为了感谢读者们,我想把我最近收藏的一些编程干货分享给大家,回馈每一个读者,希望能帮到你们。
干货主要有:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
All done~完整源代码+干货详见个人简介或者私信获取相关文件。。
以上是关于Python爬虫实战,Scrapy实战,爬取知乎表情包的主要内容,如果未能解决你的问题,请参考以下文章