Scrapy新手求助:编写类似WebMD博客的多文章抓取爬虫
修正你的Scrapy爬虫:列表页抓取标题+详情页提取正文
嘿,我帮你梳理下代码里的几个关键问题,然后给你一个能正常工作的版本:
先说说你的代码里的问题点:
- allowed_domains 配置错误:这个参数只需要填域名,不能放完整URL,你现在写的是整个起始地址,Scrapy会识别不了合法的域名范围。
- Rules 拼写错误:Scrapy的爬虫规则属性是小写的
rules,大写的Rules不会被框架识别,这就是为什么跳不到详情页的核心原因。 - LinkExtractor 使用错误:
restrict_css是用来定位链接所在元素的选择器,不是提取href属性的写法,应该写成.posts-list-post-content a。- 没指定
allow规则,这样LinkExtractor会抓取页面上所有链接,包括导航、分页这些无关链接,你需要用正则匹配详情页的URL格式。 - 回调函数复用了
parse,导致列表页和详情页的处理逻辑混在一起,应该分开写。
- 手动请求的冗余逻辑:你自己写的
next_page请求完全没必要,rules里的follow=True会自动跟进符合规则的链接。
修正后的完整代码
import scrapy from scrapy.spiders import Rule from scrapy.linkextractors import LinkExtractor class MedicalSpider(scrapy.Spider): name = 'medical' # 修正:只保留域名 allowed_domains = ['blogs.webmd.com'] start_urls = ['https://blogs.webmd.com/diabetes/default.htm'] # 修正:小写的rules,配置正确的LinkExtractor规则 rules = ( # 匹配详情页链接,回调到parse_detail处理正文,follow=True继续跟进页面内的其他详情链接 Rule(LinkExtractor(allow=r'/diabetes/\d+/\d+/.*', restrict_css='.posts-list-post-content a'), callback="parse_detail", follow=True), # 如果需要翻页,可以加一条匹配分页链接的规则,比如: # Rule(LinkExtractor(restrict_css='.pagination-next a'), follow=True), ) def parse(self, response): # 处理列表页:提取列表里的文章标题(可选,如果你需要列表页的标题数据) for post in response.css('.posts-list-post'): yield { 'list_page_headline': post.css('.posts-list-post-content::text').get().strip(), 'list_page_desc': post.css('.posts-list-post-desc::text').get().strip() } def parse_detail(self, response): # 处理详情页:提取正文内容 yield { 'headline': response.css('.article-headline::text').get().strip(), # 提取所有正文段落,用join拼接成完整内容 'content': '\n'.join([p.get().strip() for p in response.css('.article-body p::text')]) }
代码说明:
- allowed_domains:改成了正确的域名
blogs.webmd.com,确保Scrapy只抓取这个域名下的内容。 - rules配置:
- 用
allow=r'/diabetes/\d+/\d+/.*'匹配详情页的URL(这类URL包含年份、月份,比如/diabetes/2024/05/xxx)。 restrict_css='.posts-list-post-content a'定位列表页里的文章链接。- 回调到
parse_detail专门处理详情页的正文提取。
- 用
- parse函数:现在用来处理列表页,遍历每个文章条目,提取列表页上的标题和简介(如果不需要可以去掉,但保留的话能拿到列表页的基础数据)。
- parse_detail函数:专门处理详情页,提取文章标题和正文段落,把所有段落拼接成完整的正文内容。
运行这个爬虫后,它会自动遍历列表页的所有文章链接,进入详情页抓取正文,同时如果有分页的话,你可以把注释里的分页规则打开,就能自动翻页抓取更多文章了。
内容的提问来源于stack exchange,提问作者Rahul Anand
相关产品推荐
相关产品推荐

