通用式爬虫开发第二版
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
到这里,代码就结束了,大家有疑问可以随时联系我!
网友评论