Python Scrapy需要抓取网站上的所有下一个链接,并转到下一页
我需要我的scrapy进入下一页请给我规则的正确代码,如何编写Python Scrapy需要抓取网站上的所有下一个链接,并转到下一页,python,web-scraping,scrapy,web-crawler,scrapy-spider,Python,Web Scraping,Scrapy,Web Crawler,Scrapy Spider,我需要我的scrapy进入下一页请给我规则的正确代码,如何编写 from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.selector import Selector from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor from delh.items import DelhItem class criticspider(CrawlSpide
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.selector import Selector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from delh.items import DelhItem
class criticspider(CrawlSpider):
name ="delh"
allowed_domains =["consumercomplaints.in"]
#start_urls =["http://www.consumercomplaints.in/?search=delhivery&page=2","http://www.consumercomplaints.in/?search=delhivery&page=3","http://www.consumercomplaints.in/?search=delhivery&page=4","http://www.consumercomplaints.in/?search=delhivery&page=5","http://www.consumercomplaints.in/?search=delhivery&page=6","http://www.consumercomplaints.in/?search=delhivery&page=7","http://www.consumercomplaints.in/?search=delhivery&page=8","http://www.consumercomplaints.in/?search=delhivery&page=9","http://www.consumercomplaints.in/?search=delhivery&page=10","http://www.consumercomplaints.in/?search=delhivery&page=11"]
start_urls=["http://www.consumercomplaints.in/?search=delhivery"]
rules = (Rule(SgmlLinkExtractor(restrict_xpaths=('//div[@class="pagelinks"]/a/@href',)),
callback="parse_gen", follow= True),
)
def parse_gen(self,response):
hxs = Selector(response)
sites = hxs.select('//table[@width="100%"]')
items = []
for site in sites:
item = DelhItem()
item['title'] = site.select('.//td[@class="complaint"]/a/span/text()').extract()
item['content'] = site.select('.//td[@class="compl-text"]/div/text()').extract()
items.append(item)
return items
spider=criticspider()
据我所知,您试图刮取两种类型的页面,因此您应该使用两种不同的规则:
- 分页列表页,包含指向n个项目页和后续列表页的链接
- 项目页面,您可以从中刮取项目
rules = (
Rule(LinkExtractor(restrict_xpaths='{{ item selector }}'), callback='parse_gen'),
Rule(LinkExtractor(restrict_xpaths='//div[@class="pagelinks"]/a[contains(text(), "Next")]/@href')),
)
说明:
- 第一个规则匹配项目链接,并使用项目解析方法(
)作为回调。生成的响应不会再次执行这些规则parse\u gen
- 第二条规则与“pagelinks”匹配,并且没有指定回调,生成的响应将由这些规则处理
已过时,您应该使用SgmlLinkExtractor
(或其别名lxmlinkextractor
)代替()LinkExtractor
- 发送请求的顺序确实很重要,在这种情况下(清除未知的、可能大量的页面/项目),您应该设法减少在任何给定时间处理的页面数。为此,我以两种方式修改了您的代码:
- 在请求下一个项目之前,从当前列表页面中刮取项目,这就是项目规则在“页面链接”规则之前的原因
- 避免对页面进行多次爬网,这就是为什么我在“页面链接”规则中添加了
选择器。这样,每个“列表页”只被请求一次[contains(text(),“Next”)]