Я пытаюсь получить каждую ссылку (и никаких других данных) с веб-сайта, используя 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()
Я думаю, что я ошибаюсь, это "Правила", которые, как я понимаю, вам нужно перейти по ссылкам, но я не до конца понимаю, как это работает (попытался прочитать несколько объяснений в Интернете, но все еще нет уверен).
Любая помощь будет высоко ценится!