我是新手,我写第一只蜘蛛成为了一个类似于https://blogs.webmd.com/diabetes/default.htm的网站的蜘蛛。
我要抓取标题,然后导航至每篇文章,以抓取每篇文章的文字内容。
我已经尝试过使用规则和linkextractor,但是它无法导航到下一页并提取。我收到错误消息:Spider错误处理https://blogs.webmd.com/diabetes/default.htm>(引荐来源:无)
下面是我的代码
import scrapy
from scrapy.spiders import Rule
from scrapy.linkextractors import LinkExtractor
class MedicalSpider(scrapy.Spider):
name = 'medical'
allowed_domains = ['https://blogs.webmd.com/diabetes/default.htm']
start_urls = ['https://blogs.webmd.com/diabetes/default.htm']
Rules = (Rule(LinkExtractor(allow=(), restrict_css=('.posts-list-post-content a ::attr(href)')), callback="parse", follow=True),)
def parse(self, response):
headline = response.css('.posts-list-post-content::text').extract()
body = response.css('.posts-list-post-desc::text').extract()
print("%s : %s" % (headline, body))
next_page = response.css('.posts-list-post-content a ::attr(href)').extract()
if next_page:
next_href = next_page[0]
next_page_url = next_href
request = scrapy.Request(url=next_page_url)
yield request
请指导新手抓紧工作,以使该蜘蛛正确出现在每页上的多篇文章中。
答案 0 :(得分:1)
通常在使用scrapy时,每个响应都会由 parse回调进行解析。主要的write
方法是为每个parse
获得的初始响应的回调。
该解析功能的目标应该是“识别文章链接”,并对每个链接发出请求。然后,这些响应将由另一个回调start_urls
进行解析,该回调然后将从该特定文章中提取所有内容。
您甚至不需要parse_article
。考虑:
LinkExtractor
我没有粘贴完整的代码,因为我相信您仍然想学习如何做到这一点而感到兴奋,但是您可以在此gist
中找到我的想法。请注意,import scrapy
class MedicalSpider(scrapy.Spider):
name = 'medical'
allowed_domains = ['blogs.webmd.com'] # Only the domain, not the URL
start_urls = ['https://blogs.webmd.com/diabetes/default.htm']
def parse(self, response):
article_links = response.css('.posts-list-post-content a ::attr(href)')
for link in article_links:
url = link.get()
if url:
yield response.follow(url=url, callback=self.parse_article)
def parse_article(self, response):
headline = 'some-css-selector-to-get-the-headline-from-the-aticle-page'
# The body is trickier, since it's spread through several tags on this particular site
body = 'loop-over-some-selector-to-get-the-article-text'
yield {
'headline': headline,
'body': body
}
方法正在返回字典。这些正在使用Scrapy的项目管道。您可以通过使用以下代码运行代码来获得整洁的json输出:parse_article