Python scrapy-如何使用数据框中的数据填充项?
假设以下爬行爬行器:Python scrapy-如何使用数据框中的数据填充项?,python,pandas,scrapy,Python,Pandas,Scrapy,假设以下爬行爬行器: import scrapy from scrapy.loader import ItemLoader from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor from tutorial.items import TestItem from scrapy.http import HtmlResponse class TestCrawlSpide
import scrapy
from scrapy.loader import ItemLoader
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from tutorial.items import TestItem
from scrapy.http import HtmlResponse
class TestCrawlSpider(CrawlSpider):
name = "test_crawl"
allowed_domains = ["www.immobiliare.it"]
start_urls = [
"http://www.immobiliare.it/Roma/case_in_vendita-Roma.html?criterio=rilevanza",
"http://www.immobiliare.it/Napoli/case_in_vendita-Napoli.html?criterio=rilevanza"
]
rules = (
Rule(LinkExtractor(allow=(), restrict_xpaths=('//a[@class="no-decoration button next_page_act"]',)), callback="parse_start_url", follow= True),
)
def parse_start_url(self, response):
for selector in response.css('div.content'):
l = ItemLoader(item=TestItem(), selector=selector)
l.add_css('Price', '.price::text')
l.add_value('City', '...')
l.add_value('Longitude', '...')
l.add_value('Latitude', '...')
yield l.load_item()
以及相应的项目.py:
import scrapy
from scrapy.loader import ItemLoader
from scrapy.loader.processors import TakeFirst, MapCompose, Join
class TestItem(scrapy.Item):
Price = scrapy.Field(
output_processor=MapCompose(unicode.strip),
)
City = scrapy.Field(serializer=str)
Latitude = scrapy.Field(serializer=str)
Longitude = scrapy.Field(serializer=str)
对于每个起始url,我都将相应的地理信息(“城市”、“经度”、“纬度”)存储在一个数据框中。对于上面的示例,dataframe如下所示:
City Latitude Longitude
0 Roma 40.85 14.30
1 Napoli 41.53 12.30
如何使用存储在数据框中的信息填充“城市”、“经度”、“纬度”项?我将使用
start\u requests()
方法填充每个城市的信息,通过将数据框转储到字典中以简化查找:
def start_requests(self):
df = pd.DataFrame(...)
# make a dictionary, City -> City info
d = df.set_index('City').to_dict()
pattern = re.compile(r"http://www.immobiliare.it/(\w+)/")
for url in self.start_urls:
city = pattern.search(url).group(1)
yield scrapy.Request(url, meta={"info": d[city]})
然后,在回调中,从response.meta
获取信息字典:
def parse_start_url(self, response):
info = response.meta["info"]
for selector in response.css('div.content'):
l = ItemLoader(item=TestItem(), selector=selector)
l.add_css('Price', '.price::text')
l.add_value('City', info['City'])
l.add_value('Longitude', info['Longitude'])
l.add_value('Latitude', info['Latitude'])
yield l.load_item()
未经测试。谢谢您提出的解决方案。它运行良好,但是仅适用于start\u url。当对下一页进行爬网时,我会收到错误消息
info=response.meta[“info”]
和keyror:'info'
。你知道我该怎么解决吗?@kanimbla啊,是的,这很有意义。meta
没有被传递到后续的链接。。以前没有过这种情况,请看看这是否有帮助:。谢谢!我会尽快检查的。由于我将已爬网的数据写入MySQL数据库,因此也可以使用单独的例程从数据帧添加信息。我只是觉得一次完成所有事情会更容易。@kanimbla是的,我也在考虑这个问题。可能更合适的地方是自定义管道..在将提取的项目插入数据库之前填写此信息。谢谢。@kanimbla真棒,如果您在本主题中还有什么需要帮助的,请告诉我。谢谢