当有CONCURRENT_REQUESTS,没有DOWNLOAD_DELAY 时,服务器会在同一时间收到大量的请求。
当有CONCURRENT_REQUESTS,有DOWNLOAD_DELAY 时,服务器不会在同一时间收到大量的请求。
两种方法能够使 requests 不被过滤:
1. 在 allowed_domains
中加入 url
2. 在 scrapy.Request() 函数中将参数 dont_filter=True
设置为 True
去掉重复过滤器无望的情况下, 可以先在Request的初始化函数中, 传入dont_filter=True.
理解:
第一个作用:
(allowed_domains中限制允许发送请求的url,假如你发送的请求被allowed限制,你又想发送请求,在request请求中设置参数dont_filter=True)
第二个作用:
重复抓取一个页面的方法
# scrapy默认会过滤重复网页,发起Request添加dont_filter=True,则可以重复请求
# 使用的时候要注意, 不要进入死循环
文档详解:VVVV
dont_filter( boolean) - 表示调度程序不应过滤此请求。当您想要多次执行相同的请求时,可以使用此选项来忽略重复过滤器。小心使用它,否则您将进入爬行循环。默认为False。
使用中遇到的一些问题
- 一个爬虫项目中,是否支持多个Item?
- 在一个页面抓取多个Item?不同的Item如何存储?
- 爬虫进入下一级网页?
- 在爬虫中携带自定义数据?
- 重复抓取一个页面的方法?
- 分别指定每个爬虫的设置?
- 防止爬虫被ban?
针对以上问题,下面给出具体的代码示例
- 定义可以定义多个Item
# myspider/items.py
import scrapy
class Item1(scrapy.Item):
url = scrapy.Field()
name = scrapy.Field()
class Item2(scrapy.Item):
url = scrapy.Field()
job_id = scrapy.Field()
job_title = scrapy.Field()
- 具体的爬虫脚本
# myspider/spiders/myspider.py
class Spider1(CrawlSpider):
# 爬虫的名字
name = "spider1"
# 要抓取的网页限制
allowed_domains = ["mysite.com"]
# 指定开始抓取的url
start_urls = [
"http://mysite.com/",
"http://mysite2.com/",
]
# parse方法为抓取入口
# 抓取 start_urls 中的网址
def parse(self, response):
sel = Selector(response)
# 在一个页面抓取多个Item
# 在分析网页过程中,通过 yield item ,可以生成多个item
item = new Item1()
item['url'] = response.url
item['name'] = sel.xpath('').extract()
yield item
item2 = new Item2()
item2['url'] = response.url
item2['job_id'] = sel.xpath('//h2[1]/a/@hre