python - 如何使用 Scrapy 递归地从网站上抓取每个链接?
问题描述
我正在尝试使用 Scrapy 从网站获取每个链接(而不是其他数据)。我想从主页开始,从那里抓取所有链接,然后对于找到的每个链接,点击链接并从该页面抓取所有(唯一)链接,并对找到的所有链接执行此操作,直到没有更多链接跟随。
我还必须输入用户名和密码才能进入网站上的每个页面,因此我在 start_requests 中包含了一个基本的身份验证组件。
到目前为止,我有一个蜘蛛,它只给我主页上的链接,但我似乎无法弄清楚为什么它不跟随链接并抓取其他页面。
这是我的蜘蛛:
from examplesite.items import ExamplesiteItem
import scrapy
from scrapy.linkextractor import LinkExtractor
from scrapy.spiders import Rule, CrawlSpider
from scrapy import Request
from w3lib.http import basic_auth_header
from scrapy.crawler import CrawlerProcess
class ExampleSpider(CrawlSpider):
#name of crawler
name = "examplesite"
#only scrape on pages within the example.co.uk domain
allowed_domains = ["example.co.uk"]
#start scraping on the site homepage once credentials have been authenticated
def start_requests(self):
url = str("https://example.co.uk")
username = "*********"
password = "*********"
auth = basic_auth_header(username, password)
yield scrapy.Request(url=url,headers={'Authorization': auth})
#rules for recursively scraping the URLS found
rules = [
Rule(
LinkExtractor(
canonicalize=True,
unique=True
),
follow=True,
callback="parse"
)
]
#method to identify hyperlinks by xpath and extract hyperlinks as scrapy items
def parse(self, response):
for element in response.xpath('//a'):
item = ExamplesiteItem()
oglink = element.xpath('@href').extract()
#need to add on prefix as some hrefs are not full https URLs and thus cannot be followed for scraping
if "http" not in str(oglink):
item['link'] = "https://example.co.uk" + oglink[0]
else:
item['link'] = oglink
yield item
这是我的物品类:
from scrapy import Field, Item
class ExamplesiteItem(Item):
link = Field()
我认为我出错的地方是“规则”,我知道您需要按照链接进行操作,但我并不完全理解它是如何工作的(尝试在网上阅读一些解释,但仍不确定)。
任何帮助将非常感激!
解决方案
你的规则很好,问题是覆盖parse
方法。
来自https://doc.scrapy.org/en/latest/topics/spiders.html#crawling-rules的 scrapy 文档
在编写爬虫规则时,避免使用
parse
as callback,因为它CrawlSpider
使用parse
方法本身来实现其逻辑。因此,如果您覆盖该parse
方法,爬虫将不再工作。
推荐阅读
- javascript - 正确选中复选框时如何启用?
- winscp - WinSCP 如何确定错误?
- python - Python pandas:ParserError:错误可能是由于使用多字符定界符时忽略引号引起的
- python - 以优雅的方式禁用函数链接调用
- sql - 如果 ID 相同,则将值相加的方法
- python - 如何在 matplotlib.pyplot.text() 函数中为 x 和 y 轴设置两个不同的坐标系?
- python - 使用 openpyxl 将 xlsx 文件加载到数据帧中
- flutter - 从命名路由重定向用户
- c++ - 错误:“std::chars_format”尚未声明
- python - Pandas 将行分解为可变行数