美文网首页大数据 爬虫Python AI Sql爬虫专题
Scrapy_Redis抓取百度贴吧、微信文章、微信公众号、域名

Scrapy_Redis抓取百度贴吧、微信文章、微信公众号、域名

作者: 逆向与爬虫的故事 | 来源:发表于2018-10-25 13:14 被阅读58次
    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
    

    到这里,代码就结束了,大家有疑问可以随时联系我!

    相关文章

      网友评论

      本文标题:Scrapy_Redis抓取百度贴吧、微信文章、微信公众号、域名

      本文链接:https://www.haomeiwen.com/subject/qxbqtqtx.html