scrapy的高级网络抓取

本文介绍了如何在Scrapy框架中设置并创建名为zipru_spider的爬虫,包括定义start_urls、解析HTML内容提取所需数据,以及遇到的403错误可能的原因——用户代理。作者提到将使用tcpdump分析请求头以解决问题。
摘要由CSDN通过智能技术生成

设置项目

运行

scrapy startproject zipru_scraper

如下:

└── zipru_scraper
    ├── zipru_scraper
    │   ├── __init__.py
    │   ├── items.py
    │   ├── middlewares.py
    │   ├── pipelines.py
    │   ├── settings.py
    │   └── spiders
    │       └── __init__.py
    └── scrapy.cfg
添加爬虫:

创建一个使用以下内容命名的文件

zipru_scraper/spiders/zipru_spider.py

import scrapy

class ZipruSpider(scrapy.Spider):
    name = 'zipru'
    start_urls = ['一个想爬取的链接']

        拿取URL scrapy.Spiderstart_requests()start_urlsstart_urls

我们添加一个方法来找到和抓取

    def parse(self, response):
        # proceed to other pages of the listings
        for page_url in response.css('a[title ~= page]::attr(href)').extract():
            page_url = response.urljoin(page_url)
            yield scrapy.Request(url=page_url, callback=self.parse)

我们会发现到其它页面的所有链接,回到响应对象

start_urlsparse(response)parse(response)parse(response)

我们对一个页面的爬取一般都会有【标题,URL,大小,内容,评论】。

    def parse(self, response):
        # proceed to other pages of the listings
        for page_url in response.xpath('//a[contains(@title, "page ")]/@href').extract():
            page_url = response.urljoin(page_url)
            yield scrapy.Request(url=page_url, callback=self.parse)

        # extract the torrent items
        for tr in response.css('table.lista2t tr.lista2'):
            tds = tr.css('td')
            link = tds[1].css('a')[0]
            yield {
                'title' : link.css('::attr(title)').extract_first(),
                'url' : response.urljoin(link.css('::attr(href)').extract_first()),
                'date' : tds[2].css('::text').extract_first(),
                'size' : tds[3].css('::text').extract_first(),
                'seeders': int(tds[4].css('::text').extract_first()),
                'leechers': int(tds[5].css('::text').extract_first()),
                'uploader': tds[7].css('::text').extract_first(),
            }

我们这个方法生产字典,并且类型自动与请求区分开来。一般包含在parse(response)

现在就可以:scrapy crawl zipru -o torrents.jl

之后我们就可以看见了一个JSON的文件格式

最后给出一个问题:

简单的问题

我们的第一个请求得到一个被忽略的响应,然后一切都关闭了,因为我们只用一个 URL 播种了爬网。 即使在没有会话历史记录的隐身模式下,相同的请求在 Web 浏览器中也能正常工作,因此这必须是由请求标头中的某些差异引起的。 我们可以使用 tcpdump 来比较两个请求的标头,但这里有一个常见的罪魁祸首,我们应该首先检查:用户代理。403

在下一篇的时候给与解答

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

eqwaak0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值