我试图了解为什么我的LinkExtractor
不起作用以及它何时在抓取循环中真正运行?
This是我正在抓取的页面。
parse_page
中进行了解析parse_item
中解析每个抓取的链接此脚本可以毫无问题地爬行第一页及其中的项目。问题是,它没有跟随https://www.yenibiris.com/is-ilanlari?q=yazilim&sayfa=2(sayfa的土耳其语页面)和其他下一页。
我认为我的Rule
和LinkExtractor
是正确的,因为当我尝试允许所有链接时,它也不起作用。
我的问题是
LinkExtractors
应该在何时在此脚本中运行,为什么它们不运行?LinkExtractors
解析其中的项目?parse_page
实现LinkExtractor
?这是我蜘蛛的相关部分。
class YenibirisSpider(CrawlSpider):
name = 'yenibirisspider'
rules = (
Rule(LinkExtractor(allow=(r'.*&sayfa=\d+',)),
callback='parse_page',
follow=True),
)
def __init__(self):
super().__init__()
self.allowed_domains = ['yenibiris.com']
self.start_urls = [
'https://www.yenibiris.com/is-ilanlari?q=yazilim',
]
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(
url=url,
method='GET',
callback=self.parse_page
)
def parse_page(self, response):
items = response.css('div.listViewRowsContainer div div div.jobTitleLnk a::attr(href)').getall()
for item in items:
yield scrapy.Request(
url=item,
method='GET',
callback=self.parse_items
)
def parse_items(self, response):
# crawling the item without any problem here
yield item
答案 0 :(得分:0)
我不想回答自己的问题,但我想我已经解决了。当我定义start_requests
函数时,我可能会覆盖rules
行为,因此它不起作用。当我删除__init__
和start_requests
函数时,spider会按预期工作。
class YenibirisSpider(CrawlSpider):
name = 'yenibirisspider'
start_urls = [
'https://www.yenibiris.com/is-ilanlari?q=yazilim&sayfa=1',
]
rules = (
Rule(LinkExtractor(allow=(r'.*&sayfa=\d+',)), callback='parse_page', follow=True),
)
def parse_page(self, response):
items = response.css('div.listViewRowsContainer div div div.jobTitleLnk a::attr(href)').getall()
for item in items:
yield scrapy.Request(
url=item,
method='GET',
callback=self.parse_items
)
def parse_items(self, response):
# crawling the item without any problem here
yield item
答案 1 :(得分:0)
似乎您的rule
和LinkExtractor
定义正确。但是,我不明白为什么要同时定义start_requests()和start_urls。如果您不覆盖start_requests()
并且仅覆盖start_urls
,则父类“ start_request()
”会在start_urls
属性中生成对URL的请求。因此,在您的情况下,其中之一是多余的。另外,__init__
定义是错误的。应该是这样的:
def __init__(self,*args,**kwargs):
super(YenibirisSpider,self).__init__(*args,**kwargs)
...
LinkExtractors应该何时在此脚本中运行,以及为什么 他们没有在跑吗?
LinkExtractor在收到响应时从相应响应中提取链接。
如何使Spider跟随下一页,解析页面 并使用LinkExtractors解析其中的项目
LinkExtractor中的正则表达式.*&sayfa=\d+
适用于该网页。在按预期修复代码中的错误后,它应该可以工作。
如何使用LinkExtractor实现parse_page?
我不明白你在这里的意思。