背景(可以跳过):
我当前正在运行两个不同的 scrapy 爬虫。
第一个检索有关产品 x 的信息,第二个检索有关产品 x 的其他信息,这些信息是在第一个机器人抓取的 url 上找到的.
我的管道将每个产品的信息连接到多个文本文件中,其中每个产品的信息占用一行数据,并作为不同的文本文件分为多个类别。
每个机器人显然都保持信息完整性,因为所有信息一次解析一个链接(因此每个文本文件的信息与其他文本文件逐行对齐)。但是,我知道 scrapy 使用动态抓取机制,根据加载时间而不是 start_url 列表中的顺序来抓取网站。因此,我的第二个爬虫的信息与第一个爬虫的其他文本文件不一致。
一个简单的解决方法是抓取两者都找到的信息的“主键”(mysql fanboys)变体因此,可以通过按字母顺序对主键进行排序来帮助对齐表中的产品信息,从而手动对齐数据。
然而,我当前的项目在查找主键方面使我陷入了困境。第二个爬虫抓取具有有限唯一信息的网站,因此我将其发现链接回第一个爬虫的唯一方法是使用第一个爬虫识别的 url 并将其链接到第二个爬虫中的相同 start_url。
问题:
有没有一种方法可以将 xhtmlselector 的每次迭代中抓取的 start_url 分配给一个变量,然后可以将该变量与在该特定 url 上抓取的项目/字段数据一起推入管道(在无法在中找到它的情况下)源代码)?
这是我的代码:
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from Fleche_Noire.items import FlecheNoireItem
import codecs
class siteSpider(BaseSpider):
name = "bbs"
allowed_domains = ["http://www.samplewebsite.abc"]
start_urls = [
'http://www.samplewebsite.abc/prod1',
'http://www.samplewebsite.abc/prod2',
]
def parse(self, response):
hxs = HtmlXPathSelector(response)
items = []
item = FlecheNoireItem()
item["brand"] = []
item["age"] = []
item["prodcode"] = hxs.select('//h1/text()').extract() or [' ']
item["description1"] = []
item["description2"] = []
item["product"] = []
item["availability"] = []
item["price"] = []
item["URL"] = []
item["imgurl"] = []
items.append(item)
return items
我希望能够将 start_url 存储为一个项目,就像页面上找到的 h1 文本一样。
谢谢!
当然可以!在 Scrapy 中,你可以通过
response
对象访问当前的 start URL。你可以像其他数据字段一样,在
parse
方法中将其添加到你的项目中。
以下是修改后的代码:
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from Fleche_Noire.items import FlecheNoireItem
import codecs
class siteSpider(BaseSpider):
name = "bbs"
allowed_domains = ["http://www.samplewebsite.abc"]
start_urls = [
'http://www.samplewebsite.abc/prod1',
'http://www.samplewebsite.abc/prod2',
]
def parse(self, response):
hxs = HtmlXPathSelector(response)
items = []
item = FlecheNoireItem()
item["brand"] = []
item["age"] = []
item["prodcode"] = hxs.select('//h1/text()').extract() or [' ']
item["description1"] = []
item["description2"] = []
item["product"] = []
item["availability"] = []
item["price"] = []
# 将 start_url 存储到项目中
item["URL"] = [response.url]
item["imgurl"] = []
items.append(item)
return items
在这个修改后的代码中,我们使用
response.url
获取当前页面的 URL,并将其存储在
item["URL"]
中。
这样,你就可以在管道中访问每个项目的 start URL,并将其与其他信息一起使用。
标签:python,web-scraping,url,scrapy,variable-assignment From: 21541614