如何用Scrapy解决网页抓取中双重403响应问题

kgsdhlau  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(144)

我试着从这个网站上获得文章。我试过:

  • 进入主url
  • 进入子url,完整的文章在那里
  • 我从完整的文章中得到了我需要的所有细节

但是当我首先尝试运行我的代码时得到了响应403,然后我尝试通过在请求start_urls时添加头来修复它,就像我从一些答案中读到的那样。我这样做了,但是当我进入子URL时,我的脚本给了我错误,它说响应403,我需要的所有信息都在那里。
我的当前代码如下

import scrapy
from scrapy import Request
from scrapy.crawler import CrawlerProcess

class climateupdate(scrapy.Spider):
    name = 'climateupdate'
    start_urls = ['http://www.bom.gov.au/climate/updates/']

    def start_requests(self):
        headers= {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:48.0) Gecko/20100101 Firefox/48.0'}
        for url in self.start_urls:
            yield Request(url, headers=headers)

    def parse(self, response):
        for link in response.xpath('//*[@id="content"]/ul/li[1]/a/@href'):
            yield response.follow(
                url=link.get(),
                callback=self.parse_item
            )

    def parse_item(self, response):
        yield {
            'date': response.xpath('//*[@id="updates"]/p[1]/time/text()').extract(),
            'title': response.xpath('//*[@id="updates"]/div[1]/h1/text()').get(),
            'text':''.join([x.get().strip() for x in response.xpath('//*[@class="key-points box-notice bg-grey"]//p//text()')])
            }
if __name__ == '__main__':
    process = CrawlerProcess()
    process.crawl(weeklymining)
    process.start()

我应该如何写我的脚本,以便进入子网址,并获得有关文章的所有细节。
先谢谢你了。

xfb7svmp

xfb7svmp1#

1.在这里使用标头是不正确的,这就是为什么您会得到403
1.使用自定义设置插入用户代理
1.你的date and text选择xpath表达式不正确

  1. //*[@id="content"]/ul/li[1]/a/@href只选择一个详细信息url

完整的工作代码:

import scrapy
from scrapy import Request
from scrapy.crawler import CrawlerProcess

class climateupdate(scrapy.Spider):
    name = 'climateupdate'
    start_urls = ['http://www.bom.gov.au/climate/updates/']
    custom_settings = {
            'CONCURRENT_REQUESTS_PER_DOMAIN': 1,
            'DOWNLOAD_DELAY': 1,
            'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
            }

    def start_requests(self):
        for url in self.start_urls:
            yield Request(url,callback=self.parse)

    def parse(self, response):
        for link in response.xpath('//*[@class="list-archive"]/li/a/@href'):
            yield response.follow(
                url=link.get(),
                callback=self.parse_item
            )

    def parse_item(self, response):
        yield {
            'date': response.xpath('//*[@id="updates"]/p[1]/time/text()').get(),
            'title': ''.join(response.xpath('//*[@id="updates"]//h1//text()').getall()).strip(),
            'text':''.join(response.xpath('//*[@id="updates"]//p//text()').getall()[1:]).strip()
            }
if __name__ == '__main__':
    process = CrawlerProcess()
    process.crawl(weeklymining)
    process.start()

相关问题