问题:如果我们想要对某一个网站的全站数据进行爬取?
解决方案:
1. 手动请求的发送
2. CrawlSpider(推荐)
CrawlSpider概念:CrawlSpider其实就是Spider的一个子类。CrawlSpider功能更加强大(链接提取器,规则解析器)。
创建:
scrapy genspider –t crawl 爬虫名称 起始url
爬虫相关操作
# -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule class ChoutiSpider(CrawlSpider): name = 'chouti' # allowed_domains = ['dig.chouti.com'] start_urls = ['https://dig.chouti.com/'] # 实例化了一个链接提取器对象 # 链接提取器:用来提取指定的链接(url) # allow参数:赋值一个正则表达式 # 链接提取器就可以根据正则表达式在页面中提取指定的链接 # 提取到的链接会全部交给规则解析器 link = LinkExtractor(allow=r'/all/hot/recent/d+') rules = ( # 实例化了一个规则解析器对象 # 规则解析器接收了链接提取器发送的链接后,就会对这些链接发起请求,获取链接对应的页面内容,就会根据指定的规则对页面内容指定的数据值进行解析 # callback:指定一个解析规则(方法/函数) # fallow:是否将链接提取器继续作用到链接提取器提取出的链接所表示的页面数据中。 # 比如提取到12页,那它就会提取12前面和12后面的页码,这样会有很多重复,但是不用担心,它会自动帮我们去重 # 如果对全战数据进行爬取,需要让follow=True Rule(link, callback='parse_item', follow=True), ) def parse_item(self, response): print(response)
配置
BOT_NAME = 'crawlSpiderPro' SPIDER_MODULES = ['crawlSpiderPro.spiders'] NEWSPIDER_MODULE = 'crawlSpiderPro.spiders' # Crawl responsibly by identifying yourself (and your website) on the user-agent # USER_AGENT = 'crawlSpiderPro (+http://www.yourdomain.com)' USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36' # Obey robots.txt rules ROBOTSTXT_OBEY = False