首页 > 编程语言 > 详细

Python爬虫实战,Scrapy实战,爬取知乎表情包

时间:2021-06-19 09:33:26      阅读:42      评论:0      收藏:0      [点我收藏+]

技术分享图片

前言

今天我们就用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实战,爬取知乎表情包

原文:https://www.cnblogs.com/daimubai/p/14901584.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!