引言
在Scrapy进行数据爬取的时候,直接能够爬取到目标数据的概率不大,一般都是需要通过几层URL地址的爬取,才能最终获取到想要的结果数据,那该如何实现这些目标呢?
爬虫设计思路
在Scrapy中定义的Request和FormRequest对象都提供了callback字段,运行在爬取网页之后,可以执行callback方法,进行结果响应.
基本的思路就是在callback()中实现对于下一层URL Web页面路径定义,并创建出响应的Request对象,通过yield的方式交给Scrapy框架。
这里的嵌套层次是没有限制的,一般都是通过不同的callback来实现分层爬取。
如果在Request中未指定callback方法,则默认会调用parse()方法,在spider内部定义的内置方法,在自定义的spider中重写.
start_requests()是在spider中定义的内置方法,提供自自定义的request对象声明扩展方式.
代码实现
具体的实现代码如下:
def start_requests(self):
.........
for i in range(1, 2):
formdata['PagesUpDown$edtPage'] = str(i)
yield FormRequest(url=self.start_urls[0],
headers=self.headers, formdata=formdata,
callback=self.parse_school)
def parse_school(self, response):
urls = response.xpath('//*[@id="SpanSchoolList"]/div/div[2]/ul/li/a/@href').extract();
for url in urls:
request_url = self.base_url + url
yield scrapy.Request(request_url,
headers=self.request_headers, cookies=self.cookies,
callback=self.parse_major_enroll, meta=self.meta)
def parse_major_enroll(self, response):
......
这里的实现了2层的网络Web爬取,parse_shool()是第一层的处理逻辑,parse_major_enroll()方法是第二层web页面的处理逻辑.
总结
Scrapy提供了良好的拓展机制,帮助开发者聚焦于其业务和数据模型,其余的工作由Scrapy来提供实现和配置.