【问题标题】:SCRAPY: Every time my spider crawls, it is scraping the same page (first page)SCRAPY:每次我的蜘蛛爬行时,它都在抓取同一页面(第一页)
【发布时间】:2019-07-23 11:07:50
【问题描述】:

我已经编写了一个代码来使用 Python 中的 Scrapy 抓取页面。下面我已经粘贴了 main.py 代码。但是,每当我运行我的蜘蛛时,它只会从第一页抓取(调试:从 https://www.tuscc.si/produkti/instant-juhe> 抓取),这也是请求中的引用者标头(检查时)。

我已尝试添加“请求有效负载”字段数据的来源,将其粘贴在此处:{"action":"loadList","skip":64,"filter":{"1005":[], "1006":[],"1007":[],"1009":[],"1013":[]}},以及当我尝试用它打开页面时(在这个lookout中修改:

https://www.tuscc.si/produkti/instant-juhe#32;'action':'loadList';'skip':'32';'sort':'none'

),浏览器会打开它。但是scrapy shell没有。我还尝试从请求 URL 中添加数字:https://www.tuscc.si/cache/script/tuscc.js?1563872492384,其中查询字符串参数为 1563872492384;但它仍然不会从请求的页面中抓取。

另外,我尝试了很多变化并添加了很多东西,我在网上阅读了所有内容,只是为了看看是否会有进展,但没有......

代码是:

from scrapy.spiders import CrawlSpider
from tus_pomos.items import TusPomosItem
from tus_pomos.scrapy_splash import SplashRequest


class TusPomosSpider(CrawlSpider):
    name = 'TUSP'
    allowed_domains = ['www.tuscc.si']
    start_urls = ["https://www.tuscc.si/produkti/instant-juhe#0;1563872492384;",
                  "https://www.tuscc.si/produkti/instant-juhe#64;1563872492384;", ]
    download_delay = 5.0

    def start_requests(self):
        # payload = [
        #     {"action": "loadList",
        #      "skip": 0,
        #      "filter": {
        #          "1005": [],
        #          "1006": [],
        #          "1007": [],
        #          "1009": [],
        #          "1013": []}
        #      }]
        for url in self.start_urls:
            r = SplashRequest(url, self.parse, magic_response=False, dont_filter=True, endpoint='render.json', meta={
                'original_url': url,
                'dont_redirect': True},
                              args={
                                  'wait': 2,
                                  'html': 1
                              })
            r.meta['dont_redirect'] = True
            yield r

    def parse(self, response):
        items = TusPomosItem()
        pro = response.css(".thumb-box")
        for p in pro:
            pro_link = p.css("a::attr(href)").extract_first()
            pro_name = p.css(".description::text").extract_first()
            items['pro_link'] = pro_link
            items['pro_name'] = pro_name
            yield items

总之,我要求从分页中抓取所有页面,例如这个页面(我也尝试使用命令scrapy shell url):

https://www.tuscc.si/produkti/instant-juhe#64;1563872492384;

但响应始终是第一页,并且在反复抓取:

https://www.tuscc.si/produkti/instant-juhe

如果您能帮助我,我将不胜感激。谢谢


PARSE_DETAILS 生成器函数

def parse_detail(self, response):
    items = TusPomosItem()
    pro = response.css(".thumb-box")
    for p in pro:
        pro_link = p.css("a::attr(href)").extract_first()
        pro_name = p.css(".description::text").extract_first()
        items['pro_link'] = pro_link
        items['pro_name'] = pro_name
        my_details = {
            'pro_link': pro_link,
            'pro_name': pro_name
        }
        with open('pro_file.json', 'w') as json_file:
            json.dump(my_details, json_file)

        yield items
        # yield scrapy.FormRequest(
        #     url='https://www.tuscc.si/produkti/instant-juhe',
        #     callback=self.parse_detail,
        #     method='POST',
        #     headers=self.headers
        #     )

在这里我不确定是否应该按原样分配我的“items”变量,还是从 response.body 中获取? 此外,产量应该是它的方式,还是我应该用一个请求来改变它(这不仅仅是部分被给出的答案代码复制)?

我是新来的,谢谢你的理解!

【问题讨论】:

    标签: python python-3.x web-scraping scrapy


    【解决方案1】:

    与使用 Splash 来呈现页面不同,从发出的底层请求中获取数据可能更有效。 下面的一段代码遍历所有带有文章的页面。在 parse_detail 下,您可以编写将响应中的数据加载到 json 中的逻辑,您可以在其中找到产品的 'pro_link' 和 'pro_name'。

    import scrapy
    import json
    from scrapy.spiders import Spider
    from ..items import TusPomosItem
    
    
    class TusPomosSpider(Spider):
        name = 'TUSP'
        allowed_domains = ['tuscc.si']
        start_urls = ["https://www.tuscc.si/produkti/instant-juhe"]
        download_delay = 5.0
    
        headers = {
            'Origin': 'https://www.tuscc.si',
            'Accept-Encoding': 'gzip, deflate, br',
            'Accept-Language': 'en-GB,en;q=0.9,nl-BE;q=0.8,nl;q=0.7,ro-RO;q=0.6,ro;q=0.5,en-US;q=0.4',
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',
            'Content-Type': 'application/json; charset=UTF-8',
            'Accept': 'application/json, text/javascript, */*; q=0.01',
            'X-Requested-With': 'XMLHttpRequest',
            'Connection': 'keep-alive',
            'Referer': 'https://www.tuscc.si/produkti/instant-juhe',
        }
    
        def parse(self, response):
            number_of_pages = int(response.xpath(
                '//*[@class="paginationHolder"]//@data-size').extract_first())
            number_per_page = int(response.xpath(
                '//*[@name="pageSize"]/*[@selected="selected"]/text()').extract_first())
    
            for page_number in range(0, number_of_pages):
                skip = number_per_page * page_number
                data = {"action": "loadList",
                        "filter": {"1005": [], "1006": [], "1007": [], "1009": [],
                                   "1013": []},
                        "skip": str(skip),
                        "sort": "none"
                        }
                yield scrapy.Request(
                    url='https://www.tuscc.si/produkti/instant-juhe',
                    callback=self.parse_detail,
                    method='POST',
                    body=json.dumps(data),
                    headers=self.headers
                    )
    
        def parse_detail(self, response):
            detail_page = json.loads(response.text)
            for product in detail_page['docs']:
                item = TusPomosItem()
                item['pro_link'] = product['url']
                item['pro_name'] = product['title']
                yield item
    

    【讨论】:

    • 这是一个很好的分页 xpath 示例。我已经导入它,并编写了解析详细信息函数。但我得到的输出是蜘蛛刚刚爬行,并没有刮。这里是 2019-07-23 16:13:29 [scrapy.core.engine] DEBUG: Crawled (200) tuscc.si/robots.txt> (referer: None) 2019-07-23 16:13:35 [scrapy. core.engine] DEBUG: Crawled (200) tuscc.si/produkti/instant-juhe> (referer: None).............之后,还有 8 个与 url 的引用者重复
    • 最好使用包含的 parse_detail 编辑您的问题或打开一个新问题以便我们检查
    • 我将编辑问题并添加 parse_detail
    • 已经编辑了我的回复,以展示如何在页面上获取产品的网址和标题,希望对您有所帮助
    • 有帮助,非常感谢。同时,如果你被介绍了,你能回答我吗,我能不能从整个网站上获取所有的 Request Payloads?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 2023-02-23
    相关资源
    最近更新 更多