为了账号安全,请及时绑定邮箱和手机立即绑定

Scrapy_Redis抓取百度贴吧、微信文章、微信公众号、域名等通用式爬虫(二)

标签:
Redis

webp

image.png

通用式爬虫开发第二版

spider parse代码详解

1.首先判断response的状态码,是否属于200到400这个范围。这里重点说一下,scrapy默认只会返回成功的状态码,将失败的状态码默认就过略掉了。所以需要我们在spider类属性里设置一个handle_httpstatus_list = [301, 300, 302, 303, 403, 400, 503, 404, 505, 500, 401]类属性,你可以将你想要抓取的状态码写入到这个list中。
2.根据我们传入的engine字段来抓取不同的超链接,详情请看代码走势。关键字默认,抓取前50页,当爬虫启动的时候,会将关键字传递到middlewares这个中间件中,selenium会模拟浏览器的行为找到输入框,将关键字输入并模拟点击,这样就会得到我们想要的页面,此时调用HtmlResponse将url和body返回给parse。

return HtmlResponse(fullurl, encoding='utf-8', body=content, request=request)

2.parse_tieba(self, response) 此函数用来解析贴吧抓取的超链接,贴吧有个反爬就是他将响应出来的源代码里都添加了注释,如果你此时用xpath去提取,是找不到你要的内容的,在这个地方我选择了re正则去提取超链接。并将提取的超链接让scrapy.Request去下载(这里的流程前面有说过),然后回调给parse_url函数。

regex = 'href="(.*?)"'
        a_list = re.compile(regex).findall(response.body)        for url in a_list:            if len(url) >= 5 and 'javascript' not in url and 'css' not in url and url.startswith('/p'):                if url.startswith('http:') != True and url.startswith('https:') != True:
                    url = response.urljoin(url)                yield scrapy.Request(url, meta={'url':response.url}, callback=self.parse_url)

3.parse_url(self, response) 此函数用于处理响应的response代码,从中提取指定的字段,并将超链接和源代码(只提取文本的形式)以MD5的方式进行加密,添加到redis set中。实现了增量式爬虫!

# 以内容做指纹
        data_md5 = self.parse_dupefilter(response)        if self.data_conn.sadd(self.datadupefilter, data_md5):
            content = soup_text(response.body)            print content
            item = self.parse_text(response)            self.data_conn.lpush(self.yuqing, item)
            yuqing_file = os.path.join(self.filepath, item['filename'])
            with open(yuqing_file, 'w') as b:
                b.write(content)

4.soup_text(body) 此函数用于处理页面中源代码,返回一个文本包括数字在内的数据。

try:
        soup = BeautifulSoup(body, 'lxml')        for script in soup(["script", "style"]):
            script.extract()
        line = re.compile(r'\s+')
        line = line.sub(r'', soup.body.getText())
        outStr = line.strip(',')    except:
        outStr = ''
    return outStr

5.parse_text(self, response)此函数是提取规定的字段,然后插入到redis list中。
并将实体文件保存到本地,供后面直接提取!

item = {}        try:
            father_url = response.meta["url"]        except:
            father_url = "''"
        try:
            item['title'] = response.xpath('//title/text()').extract_first().replace('\r\n','').replace('\n','')        except:
            item['title'] = "''"
        item['url'] = response.url
        item['domain'] = ''
        item['crawl_time'] = time.strftime('%Y%m%d%H%M%S')
        item['keyword'] = ''
        item['Type_result'] = ''
        item['type'] = 'html'
        item['filename'] = 'yq_' + str(int(time.time())) + '_0' + str(rand5())+'.txt'
        item['referver'] = father_url
        item['like'] = ''
        item['transpond'] = ''
        item['comment'] = ''
        item['publish_time'] = ''
        return item



作者:可爱的小虫虫
链接:https://www.jianshu.com/p/34c191971667


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消