Разница между запросами HtmlResponse.response

#python-3.x #python-requests #request #response

#python-3.x #python-запросы #запрос #ответ

Вопрос:

Я хочу извлечь все ссылки на парфюмерные бренды на этой веб-странице сайта.

введите описание изображения здесь

Я бы подумал сделать scrapy scraper, который находит все ссылки, как я делал с BeautifulSoup:

     soup = BeautifulSoup(requests.get('https://www.nosetime.com'  url, 
                                      headers=headers).content, 'html.parser')
    print(soup)
    result = soup.find_all('a', {'class': 'imgborder'})
    for r in result:
        brand_url = r.attrs['href']
  

requests.get возвращает объект ответа здесь

Но этот самодельный метод дает сбой с ошибками merry 403, поэтому я подумал о создании scrapy scraper, поскольку в этом руководстве утверждается, что он может справиться с этим.

 import scrapy
from bs4 import BeautifulSoup

class NosetimeScraper(scrapy.Spider):
    name = "nosetime"
    urls = ['/pinpai/2-a.html']
    start_urls = ['https://www.nosetime.com'   url for url in urls]

    def parse(self, response):
        # proceed to other pages of the listings
        soup = BeautifulSoup(response.content, 'html.parser')
        results = soup.find_all('a', {'class': 'imgborder'})
        for r in results:
            brand_url = r.attrs['href']
            yield scrapy.Request(url=brand_url, callback=self.parse)

        # then do something with the scrapy.Request() response that has been yielded ...
  

Но он возвращает:

 soup = BeautifulSoup(response.content, 'html.parser')
AttributeError: 'HtmlResponse' object has no attribute 'content'
  

Итак, я предполагаю, что есть разница между запросами HtmlResponse.response ?

Ответ №1:

Это потому scrapy.http.HtmlResponse , что отличается от requests.models.Response . Вы можете использовать response.body вместо этого.

Но было бы намного лучше использовать .css() с Scrapy:

 def parse(self, response):
    urls = response.css('a.imgborder::attr(href)').getall()
    for url in urls:
        yield scrapy.Request(url=url, callback=self.parse)
  

Комментарии:

1. Спасибо, у вас есть учебник или ресурсы о том, как выполнять очистку с помощью CSS? Я больше привык делать это с помощью beautifulsoup

2. Ознакомьтесь с документами MDN от Mozilla: developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors . Вы всегда можете протестировать свои селекторы в devtools, нажав F12 . Этого уже достаточно для большинства сайтов, но если вам нужна большая гибкость, подумайте и об изучении xpath, он вызывается с .xpath() помощью .