我正在尝试开始抓取并将网站抓取到磁盘,但无法按照我的意愿使回调功能正常工作。
以下代码将访问start_url并找到网站上的所有“a”标记。对于其中的每一个,它将进行回调,即将文本响应保存到磁盘并使用crawerItem存储有关页面的一些元数据。
我希望有人可以帮我弄清楚如何通过
以下是我的代码
import scrapy
from scrapy.spiders import Rule
from scrapy.linkextractors import LinkExtractor
from mycrawler.items import crawlerItem
class CrawlSpider(scrapy.Spider):
name = "librarycrawler"
allowed_domains = ["example.com"]
start_urls = [
"http://www.example.com"
]
rules = (
Rule(LinkExtractor(),callback='scrape_page', follow=True)
)
def scrape_page(self,response):
page_soup = BeautifulSoup(response.body,"html.parser")
ScrapedPageTitle = page_soup.title.get_text()
item = LibrarycrawlerItem()
item['title'] =ScrapedPageTitle
item['file_urls'] = response.url
yield item
在Settings.py
中ITEM_PIPELINES = [
'librarycrawler.files.FilesPipeline',
]
FILES_STORE = 'C:\Documents\Spider\crawler\ExtractedText'
在items.py
import scrapy
class LibrarycrawlerItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
Files = scrapy.Field()
答案 0 :(得分:2)
我不是百分百肯定,但我认为你无法重命名scrapy图像文件,scrapy就是这样。
您想要做的事情看起来像CrawlSpider
而非Spider
的工作。
CrawlSpider本身跟随它在递归中的每个页面中找到的每个链接,您可以设置要废弃的页面的规则。以下是docs。
如果您足够顽固地保留Spider
,您可以在请求中使用元标记来传递项目并在其中保存链接。
for link in soup.find_all("a"):
item=crawlerItem()
item['url'] = response.urljoin(link.get('href'))
request=scrapy.Request(url,callback=self.scrape_page)
request.meta['item']=item
yield request
要获取该项目,请在响应中查找:
def scrape_page(self, response):
item=response.meta['item']
在此特定示例中,传递item['url']
的项目已过时,因为您可以使用response.url
此外,
在scrapy中使用美味汤是一个坏主意,因为它只会减慢你的速度,scrapy库真的很发达到你不需要任何其他东西来提取数据的程度!