gpt4 book ai didi

python - 同时抓取太多链接

转载 作者:行者123 更新时间:2023-11-28 21:41:00 26 4
gpt4 key购买 nike

我正在尝试抓取一个网站,但我的蜘蛛(我不知道为什么)在抓取我的链接时乱七八糟!!

它正在抓取我想要的所有链接,但它只存储了第一个(排名和 url_seller 作为示例)...我是这个爬行、python 或 scrapy 领域的新手,但我只想学习!我在这里发布我的代码,有人可以帮助我吗?

# -*- coding: utf-8 -*-
import scrapy
import re
import numbers
from MarketplacePulse.items import MarketplacepulseItem
import urllib.parse
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class MarketplacePulseSpider(CrawlSpider):
name = 'MP_A_UK'
allowed_domains = ['marketplacepulse.com', 'amazon.co.uk']
start_urls = ['https://www.marketplacepulse.com/amazon/uk']

def parse(self, response):
item = MarketplacepulseItem()

rank = response.xpath('//div/table/tbody/tr/td[@class="number"]/text()').extract()
print('\n', rank, '\n')
url_1 = response.xpath('//div/table/tbody/tr/td/a/@href').extract()
print('\n', url_1, '\n')
for i in range(len(rank)-2):
item['month_rank'] = ''.join(rank[i]).strip()
item['year_rank'] = ''.join(rank[i+1]).strip()
item['lifetime_rank'] = ''.join(rank[i+2]).strip()
i += 3

for i in range(len(url_1)):
url_tmp = urllib.parse.urljoin('https://www.marketplacepulse.com',url_1[i])
yield scrapy.Request(url_tmp, callback=self.parse_2, meta={'item': item})

def parse_2(self, response):
item = response.meta['item']

url_2 = response.xpath('//body/div/section/div/div/div/p/a[contains(text(), "Amazon.co.uk")]/@href').extract()

item['url_seller'] = ''.join(url_2).strip()
yield scrapy.Request(str(url_2), callback=self.parse_3, meta={'item': item})

def parse_3(self, response):
item = response.meta['item']

business_name = response.xpath('//div[@class="a-row a-spacing-medium"]/div[@class="a-column a-span6"]/ul[@class="a-unordered-list a-nostyle a-vertical"]/li//span[@class="a-list-item"]/span[.="Business Name:"]/following-sibling::text()').extract()
phone_number = response.xpath('//div[@class="a-column a-span6"]/ul[@class="a-unordered-list a-nostyle a-vertical"]/li//span[@class="a-list-item"]/span[.="Phone number:"]/following-sibling::text()').extract()
address = response.xpath('//div[@class="a-column a-span6"]/ul[@class="a-unordered-list a-nostyle a-vertical"]/li//span[span[contains(.,"Address:")]]/ul//li//text()').extract()

item['business_name'] = ''.join(business_name).strip()
item['phone_number'] = ''.join(phone_number).strip()
item['address'] = '\n'.join(address).strip()
yield item

我还发布了一个我想要的和我得到的例子......我希望你会看到问题!!

我想要什么:

2017-07-18 11:28:27 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.amazon.co.uk/sp?_encoding=UTF8&asin=&isAmazonFulfilled=&isCBA=&marketplaceID=A1F83G8C2ARO7P&orderID=&seller=A7CL6GT0UVQKS&tab=&vasStoreID=>
{'address': '55740 Currant Rd\nMishawaka\nIndiana\n46545\nUS',
'business_name': 'Better World Books Marketplace Inc',
'lifetime_rank': '863',
'month_rank': '218',
'phone_number': '',
'url_seller': 'https://www.amazon.co.uk/gp/aag/main?seller=A7CL6GT0UVQKS&tag=mk4343k-21',
'year_rank': '100'}
2017-07-18 11:28:27 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.amazon.co.uk/sp?_encoding=UTF8&asin=&isAmazonFulfilled=&isCBA=&marketplaceID=A1F83G8C2ARO7P&orderID=&seller=W5VG5JB9GHYUG&tab=&vasStoreID=>
{'address': 'ROOM 919, BLOCK 2 West, SEG TECHNOLOGY PARK\n'
'SHENZHEN\n'
'GUANGDONG\n'
'518000\n'
'CN\n'
'FU TIAN QU QIAO XIANG LU HAO FENG YUAN 7 DONG 7A\n'
'SHENZHEN\n'
'GUANGDONG\n'
'518000\n'
'CN',
'business_name': 'MUDDER TECHNOLOGY CO., LTD',
'lifetime_rank': '3',
'month_rank': '28',
'phone_number': '86 18565729081',
'url_seller': 'https://www.amazon.co.uk/gp/aag/main?seller=W5VG5JB9GHYUG&tag=mk4343k-21',
'year_rank': '10'}

我得到的是:

2017-07-18 11:28:27 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.amazon.co.uk/sp?_encoding=UTF8&asin=&isAmazonFulfilled=&isCBA=&marketplaceID=A1F83G8C2ARO7P&orderID=&seller=A20T907OQC02JJ&tab=&vasStoreID=>
{'address': '55740 Currant Rd\nMishawaka\nIndiana\n46545\nUS',
'business_name': 'Better World Books Marketplace Inc',
'lifetime_rank': '863',
'month_rank': '218',
'phone_number': '',
'url_seller': 'https://www.amazon.co.uk/gp/aag/main?seller=A7CL6GT0UVQKS&tag=mk4343k-21',
'year_rank': '100'}
2017-07-18 11:28:27 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.amazon.co.uk/sp?_encoding=UTF8&asin=&isAmazonFulfilled=&isCBA=&marketplaceID=A1F83G8C2ARO7P&orderID=&seller=A1XG2K8M6HRQZ8&tab=&vasStoreID=>
{'address': 'ROOM 919, BLOCK 2 West, SEG TECHNOLOGY PARK\n'
'SHENZHEN\n'
'GUANGDONG\n'
'518000\n'
'CN\n'
'FU TIAN QU QIAO XIANG LU HAO FENG YUAN 7 DONG 7A\n'
'SHENZHEN\n'
'GUANGDONG\n'
'518000\n'
'CN',
'business_name': 'MUDDER TECHNOLOGY CO., LTD',
'lifetime_rank': '863',
'month_rank': '218',
'phone_number': '86 18565729081',
'url_seller': 'https://www.amazon.co.uk/gp/aag/main?seller=A7CL6GT0UVQKS&tag=mk4343k-21',
'year_rank': '100'}

您可以看到 url_seller 完全相同,排名(按月、年或生命周期)也......但我希望它们不同......并且 url_seller 与链接不同我爬了,但它必须是相同的..... 请帮忙吗?

最佳答案

排名问题

我会一步一步来:

  • 您会得到一个排名数字列表:

    rank = response.xpath('//div/table/tbody/tr/td[@class="number"]/text()').extract()
  • 您会得到一个 URL 列表:

    url_1 = response.xpath('//div/table/tbody/tr/td/a/@href').extract()
  • 这里是你出错的地方:

    for i in range(len(rank)-2):
    item['month_rank'] = ''.join(rank[i]).strip()
    item['year_rank'] = ''.join(rank[i+1]).strip()
    item['lifetime_rank'] = ''.join(rank[i+2]).strip()
    i += 3

    首先,由于您使用的是 for 循环,因此您的 i变量在每个循环开始时被重置为下一个项目(在本例中为下一个数字),因此您要遍历每个项目,而不是三个循环。那i += 3什么都不做,抱歉。

    无论如何,循环的目的似乎是构建以下结构:

    {'month_rank': <rank>, 'year_rank': <rank>, 'lifetime_rank': <rank>}

    所以...,其次,每次运行此循环时,您都会覆盖之前的一组值,而无需对它们进行任何操作。糟糕。

  • 然后您继续遍历您的 URL 列表,将您之前循环构建的最后一组排名以及每个 URL 传递给您的 parse_2功能。

    for i in range(len(url_1)):
    url_tmp = urllib.parse.urljoin('https://www.marketplacepulse.com',url_1[i])
    yield scrapy.Request(url_tmp, callback=self.parse_2, meta={'item': item})

    每次调用 parse_2 都会结束具有相同的排名数据集。

要解决此问题,您应该在同一个循环中处理您的 URL 及其关联的排名:

    for i in range(len(url_1)):
url_tmp = urllib.parse.urljoin('https://www.marketplacepulse.com',url_1[i])

item['month_rank'] = ''.join(rank[i*3]).strip()
item['year_rank'] = ''.join(rank[i*3+1]).strip()
item['lifetime_rank'] = ''.join(rank[i*3+2]).strip()

yield scrapy.Request(url_tmp, callback=self.parse_2, meta={'item': item})

这应该可以解决您的排名问题。


url_seller 问题

我不太确定 url_seller 问题,因为它似乎应该为 item['url_seller'] 使用相同的 url及其对 parse_3 的调用, 它似乎使用了正确的信息来调用 parse_3 , 但继续使用 item['url_seller'] 中的相同信息一遍又一遍。

我在这里有些犹豫,因为如果我正确理解情况,两种方法(在我认为的特定情况下)应该产生相等的字符串,但我唯一的区别到目前为止注意到的是你使用的是''.join(url_2).strip()另一个你使用的是str(url_2) .

自从您使用 str(url_2) 的部分似乎在使用它的地方工作正常,也许你也应该尝试在其他地方使用它:

    item['url_seller'] = str(url_2)

关于python - 同时抓取太多链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45157041/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com