Scrapy之URL解析与递归爬取

优采云 发布时间: 2020-08-10 19:52

  Scrapy之URL解析与递归爬取:

  前面介绍了Scrapy怎样实现一个最简单的爬虫,但是这个Demo里只是对一个页面进行了抓取。在实际应用中,爬虫一个重要功能是”发现新页面”,然后递归的使爬取操作进行下去。

  发现新页面的方式很简单,我们首先定义一个爬虫的入口URL地址,比如Scrapy入门教程中的start_urls,爬虫首先将这个页面的内容抓取以后,解析其内容,将所有的链接地址提取下来。这个提取的过程是很简单的,通过一个html解析库,将这样的节点内容提取下来,href参数的值就是一个新页面的URL。获取这个URL值以后,将其加入到任务队列中,爬虫不断的从队列中取URL即可。这样,只须要为爬虫定义一个入口的URL,那么爬虫还能够手动的爬取到指定网站的绝大多数页面。

  当然,在具体的实现中,我们还须要对提取的URL做进一步处理:

  1. 判断URL指向网站的域名,如果指向的是外部网站,那么可以将其遗弃

  2. URL去重,可以将所有爬取过的URL存入数据库中,然后查询新提取的URL在数据库中是否存在,如果存在的话,当然就无需再去爬取了。

  下面介绍一下怎样在Scrapy中完成上述这样的功能。

  我们只须要改写spider的那种py文件即可,修改parse()方法代码如下:

  [python]view plaincopyprint?

  from scrapy.selector import HtmlXPathSelector

  def parse(self, response):

  hxs = HtmlXPathSelector(response)

  items = []

  newurls = hxs.select('//a/@href').extract()

  validurls = []

  for url in newurls:

  #判断URL是否合法

  if true:

  validurls.append(url)

  items.extend([self.make_requests_from_url(url).replace(callback=self.parse) for url in validurls])

  sites = hxs.select('//ul/li')

  items = []

  for site in sites:

  item = DmozItem()

  item['title'] = site.select('a/text()').extract()

  item['link'] = site.select('a/@href').extract()

  item['desc'] = site.select('text()').extract()

  items.append(item)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线