让 scrapy spider 跟随给定开始的链接 url
Making scrapy spider follow links in given starting url
我正在尝试使用 scrapy 构建一个简单的蜘蛛来导航从给定 start_urls
开始的链接并在页面内部抓取两个项目。
目标:这是我的starting page。在这里你看到一个护身符列表,我想进入每个护身符页面并在这些页面内,刮掉风味文字和物品名称。
我首先构建了一个工作原型,给定一个护身符,它会抓取他的数据,现在我想扩展它,以便它可以同时为所有护身符执行此操作,但我一直在努力寻找如何做所以。
目前的代码如下:
import scrapy
from PoExtractor.items import PoextractorItem
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class ArakaaliSpider(scrapy.Spider):
name = "arakaali"
allowed_domains = ['pathofexile.gamepedia.com']
start_urls = ['https://pathofexile.gamepedia.com/List_of_unique_accessories']
rules = (Rule(LinkExtractor(restrict_xpaths=(unique=True), callback='parse', follow=True))
def parse(self, response):
for link in LinkExtractor(allow=(), deny=()).extract_links(response):
item = PoextractorItem()
item["item_name"] = response.xpath("//*[@id='mw-content-text']/span/span[1]/span[1]/text()[1]").extract()
item["flavor_text"] = response.xpath("//*[@id='mw-content-text']/span/span[1]/span[2]/span[3]/text()").extract()
yield item
item_name
和 flavor_text
xpath 确实运行良好,它是使用 Chrome "inspect element" 功能提取的,但规则或 "inspect element" 的循环中有些东西=17=] 不起作用,因为这是首次输出:
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
这种情况持续了一段时间,然后包含名称和风味的文件显示:
flavor_text,item_name
,
,
,
,
,
,
而且它一直持续超过 300 行。
其他有用的信息:并非页面中的所有链接都指向另一个页面,其中存在项目名称和风味,因此可以找到空白点,我的问题是,为什么它们都是白色的?它不会跟随游戏物品页面的链接吗?
提前感谢每一个回复
您必须首先编写一个函数来向游戏物品页面发送请求(解析函数本身),然后在第二个函数中添加函数解析中的当前代码。
您可以通过多种方式发送请求。
1.Since you are using scrapy, the following code can be used
def parse_page1(self, response):
return scrapy.Request("http://www.example.com/some_page.html",
callback=self.parse_page2)
def parse_page2(self, response):
# this would log http://www.example.com/some_page.html
self.logger.info("Visited %s", response.url)
parse_page1 将向 url 发送请求,您将在 parse_page2 函数中获得响应。
2.You can even send requests using python requests module,
import requests
resp = req.get("http://www.something.com")
print(resp.text)
如果对此有任何疑问,请评论,谢谢
不要使用 parse
作为 LinkExtractor
回调的名称!我已修复您的语法错误并在您的代码中添加了一些 restrict_xpaths
:
class ArakaaliSpider(CrawlSpider):
name = "arakaali"
allowed_domains = ['pathofexile.gamepedia.com']
start_urls = ['https://pathofexile.gamepedia.com/List_of_unique_accessories']
rules = (
Rule(
LinkExtractor(
restrict_xpaths='//table[contains(@class, "wikitable")]//tr/td[1]//span[@class="c-item-hoverbox__activator"]//a[1]'
),
callback='parse_details',
follow=True
),
)
def parse_details(self, response):
item = PoextractorItem()
item["item_name"] = response.xpath("//*[@id='mw-content-text']/span/span[1]/span[1]/text()[1]").extract()
item["flavor_text"] = response.xpath("//*[@id='mw-content-text']/span/span[1]/span[2]/span[3]/text()").extract()
yield item
我正在尝试使用 scrapy 构建一个简单的蜘蛛来导航从给定 start_urls
开始的链接并在页面内部抓取两个项目。
目标:这是我的starting page。在这里你看到一个护身符列表,我想进入每个护身符页面并在这些页面内,刮掉风味文字和物品名称。
我首先构建了一个工作原型,给定一个护身符,它会抓取他的数据,现在我想扩展它,以便它可以同时为所有护身符执行此操作,但我一直在努力寻找如何做所以。
目前的代码如下:
import scrapy
from PoExtractor.items import PoextractorItem
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class ArakaaliSpider(scrapy.Spider):
name = "arakaali"
allowed_domains = ['pathofexile.gamepedia.com']
start_urls = ['https://pathofexile.gamepedia.com/List_of_unique_accessories']
rules = (Rule(LinkExtractor(restrict_xpaths=(unique=True), callback='parse', follow=True))
def parse(self, response):
for link in LinkExtractor(allow=(), deny=()).extract_links(response):
item = PoextractorItem()
item["item_name"] = response.xpath("//*[@id='mw-content-text']/span/span[1]/span[1]/text()[1]").extract()
item["flavor_text"] = response.xpath("//*[@id='mw-content-text']/span/span[1]/span[2]/span[3]/text()").extract()
yield item
item_name
和 flavor_text
xpath 确实运行良好,它是使用 Chrome "inspect element" 功能提取的,但规则或 "inspect element" 的循环中有些东西=17=] 不起作用,因为这是首次输出:
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
这种情况持续了一段时间,然后包含名称和风味的文件显示:
flavor_text,item_name
,
,
,
,
,
,
而且它一直持续超过 300 行。
其他有用的信息:并非页面中的所有链接都指向另一个页面,其中存在项目名称和风味,因此可以找到空白点,我的问题是,为什么它们都是白色的?它不会跟随游戏物品页面的链接吗?
提前感谢每一个回复
您必须首先编写一个函数来向游戏物品页面发送请求(解析函数本身),然后在第二个函数中添加函数解析中的当前代码。
您可以通过多种方式发送请求。
1.Since you are using scrapy, the following code can be used
def parse_page1(self, response):
return scrapy.Request("http://www.example.com/some_page.html",
callback=self.parse_page2)
def parse_page2(self, response):
# this would log http://www.example.com/some_page.html
self.logger.info("Visited %s", response.url)
parse_page1 将向 url 发送请求,您将在 parse_page2 函数中获得响应。
2.You can even send requests using python requests module,
import requests
resp = req.get("http://www.something.com")
print(resp.text)
如果对此有任何疑问,请评论,谢谢
不要使用 parse
作为 LinkExtractor
回调的名称!我已修复您的语法错误并在您的代码中添加了一些 restrict_xpaths
:
class ArakaaliSpider(CrawlSpider):
name = "arakaali"
allowed_domains = ['pathofexile.gamepedia.com']
start_urls = ['https://pathofexile.gamepedia.com/List_of_unique_accessories']
rules = (
Rule(
LinkExtractor(
restrict_xpaths='//table[contains(@class, "wikitable")]//tr/td[1]//span[@class="c-item-hoverbox__activator"]//a[1]'
),
callback='parse_details',
follow=True
),
)
def parse_details(self, response):
item = PoextractorItem()
item["item_name"] = response.xpath("//*[@id='mw-content-text']/span/span[1]/span[1]/text()[1]").extract()
item["flavor_text"] = response.xpath("//*[@id='mw-content-text']/span/span[1]/span[2]/span[3]/text()").extract()
yield item