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