Этот — это URL-адрес карты сайта сайта, который я просматриваю. Я хочу, чтобы мой паук собирал данные со страниц, начинающихся с /имущество.
Проблема в том, что эти страницы не показывают мне правильный ответ, когда запрос отправляется без заголовков. Запросу нужен заголовок пользовательского агента.
Я придумываю такое решение. Во-первых, URL-адреса, начинающиеся с /имущество, сканируются методом parse, и этот метод получает пустой ответ. Тот же запрос отправляется вместе с заголовками методом parse, а правильный ответ будет сканироваться методом parse_items.
Метод parse_items никогда не вызывается, и процесс оболочки никогда не запускается. Я не понимаю, почему parse_items не достигается. Есть ли способ определить такой метод, как start_requests, чтобы я мог переопределить поведение метода parse для класса SitemapSpider.
class MySpider(SitemapSpider):
name = 'myspider'
sitemap_urls = [
'https://www.iproperty.com.my/sitemap_index.xml',
]
sitemap_rules = [
('/property', 'parse'),
]
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
def parse(self, response):
yield scrapy.Request(
url=response.url,
method='GET',
headers=self.headers,
callback=self.parse_items
)
def parse_items(self, response):
from scrapy.shell import inspect_response
inspect_response(response, self)






Согласно SitemapSpiderисходный код (v 1.6), он не вызывает функцию parse в качестве обратного вызова (как это делает Spider):
def start_requests(self):
for url in self.sitemap_urls:
yield Request(url, self._parse_sitemap)
Как видите, он не добавляет никаких конкретных заголовков.
Вам нужно наблюдать SitemapSpider исходный код и переопределять некоторые из его методов.
Я заметил еще одну вещь. Я не помню, чтобы пауки имели headers ценность.
Вы имели в виду настройку DEFAULT_REQUEST_HEADERS?:
class MySpider(SitemapSpider):
name = 'myspider'
sitemap_urls = [
'https://www.iproperty.com.my/sitemap_index.xml',
]
sitemap_rules = [
('/property', 'parse'),
]
CUSTOM_SETTINGS = {
DEFAULT_REQUEST_HEADERS : {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}}
....
Это работает, но я думаю, что DEFAULT_REQUEST_HEADERS должен быть между строковыми литералами.
Как насчет немного другого подхода для достижения того же? Если вы попытаетесь использовать BeautifulSoup в scrapy, результат будет таким, как вы ожидали. Возможно, именно парсер отвечает за получение ответа.
from bs4 import BeautifulSoup
import scrapy
class SitMapSpider(scrapy.Spider):
name = 'sitemap'
start_urls = ['https://www.iproperty.com.my/sitemap_index.xml']
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url, self.parse)
def parse(self,response):
soup = BeautifulSoup(response.text, 'xml')
for item in soup.select('sitemap > loc'):
yield scrapy.Request(item.text,self.parse_more_links)
def parse_more_links(self,response):
soup = BeautifulSoup(response.text, 'xml')
for item in soup.select('url > loc'):
if not "/property" in item.text:continue
yield {"item": item.text}
Однако это не будет следовать ссылкам на первой странице. URL-адреса, начинающиеся с /property, находятся на втором уровне. Вот почему мне нужно использовать SitemapSpider.
Японял твою точку зрения. Я попытался отредактировать свой пост, чтобы отразить то, что вы имели в виду. Пожалуйста, проверьте сейчас. Благодарю.
Вы можете использовать настройку DEFAULT_REQUEST_HEADERS, которую вы можете установить на самом своем пауке, используя атрибут класса custom_settings.
Если это недостаточно гибко для вас, используйте Подход Георгия переопределения SitemapSpider или на его основе напишите свой собственный паук с нуля.
Что такое
headers?