【Python Scrapy 爬虫框架】 3、利用 Scrapy 爬取博客文章详细信息

0x00 写在前面

在之前的文章中,会发现如果直接使用爬取命令,终端会回显很多调试信息,这样输出的内容就会显得很乱,所以就可以使用下面的命令:

scrapy crawl blogurl  -s LOG_FILE=all.log

也就是在原来的基础上加上一个 -s 参数,这样调试信息就会保存到参数指定的文件中,不过也可以在 class 下添加下面的代码,这样只会显示调试出现错误的信息,所以这种方式就不用加 -s 了,至于选择哪一个,就需要​视情况而定。​

custom_settings = {'LOG_LEVEL':'ERROR'}

0x01 编写子页面爬取代码

先来看一行关键代码

yield scrapy.Request(url,callback=self.sub_article)

上面这行代码中,使用 yield 返回利用 scrapy 请求 url 所获得的数据,并将数据通过 callback 传递到 sub_article 函数中。

其实对于 yield 和 return 都可以返回数据,但是利用 yield 返回数据后,还可以继续运行下面的代码,而使用 return 后,接下来的代码就不会再运行了,在 scrapy 中,如果使用 return 返回数据再用 list 存储数据,会造成不少的内存消耗,而使用 yield 则可以减少这些不必要的内存浪费。

所以接下来在 sub_article 函数中写上我们爬取子页面的代码即可,这里就爬取每个文章的标题和目录作为示例了。

def sub_article(self,response):
   soup = BeautifulSoup(response.text,'html.parser')
   print('\n',soup.select('.title')[0].text)
   for i in soup.select('.toc-text'):
      print('\t',i.text)

运行结果如下:

~# scrapy crawl blogurl  -s LOG_FILE=all.log
【漏洞笔记】Robots.txt站点文件
         0x00 概述
         0x01 漏洞描述
         0x02 漏洞危害
         0x03 修复建议
【经验总结】常见的HTTP方法
         0x00 概述
         0x01 GET
         0x02 HEAD
         0x03 POST
         0x04 PUT
         0x05 DELETE
         0x06 CONNECT
         0x07 OPTIONS
         0x08 TRACE
         0x09 PATCH
【漏洞笔记】Host头攻击
         0x00 概述
         0x01 漏洞描述
         0x02 漏洞危害
         0x03 修复建议
【直播笔记】白帽子的成长之路
【Python 学习笔记】 异步IO (asyncio) 协程
         0x00 前言
         0x01 基本用法
……省略……

0x02 完整代码

import scrapy
from bs4 import BeautifulSoup

class BlogSpider(scrapy.Spider):
   name = 'blogurl'
   start_urls = ['https://www.teamssix.com']

   def parse(self,response):
      soup = BeautifulSoup(response.text,'html.parser')
      for i in soup.select('.post-title'):
         url = 'https://www.teamssix.com{}'.format(i['href'])
         yield scrapy.Request(url,callback=self.sub_article)

   def sub_article(self,response):
      soup = BeautifulSoup(response.text,'html.parser')
      title = self.article_title(soup)
      list = self.article_list(soup)
      print(title)
      for i in list:
         print('\t',i)

   def article_title(self,soup):
      return soup.select('.title')[0].text

   def article_list(self,soup):
      list = []
      for i in soup.select('.toc-text'):
         list.append(i.text)
      return list

更多信息欢迎关注我的个人微信公众号:TeamsSix
原文链接:https://www.teamssix.com/year/191226-151652.html

参考链接:
https://youtu.be/aDwAmj3VWH4
https://blog.csdn.net/DEREK_D/article/details/84239813
http://doc.scrapy.org/en/latest/topics/architecture.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以提供一个简单的爬虫示例,用 Scrapy 笔者个人文章列表和详情。首先,需要安装 Scrapy: ``` pip install scrapy ``` 然后,在终端中输入以下命令,创建一个新的 Scrapy 项目: ``` scrapy startproject myblog ``` 接下来,切换到项目根目录,创建一个新的爬虫: ``` cd myblog scrapy genspider blog_spider myblog.com ``` 这样就创建了一个名为 `blog_spider` 的爬虫,接下来我们需要在 `blog_spider.py` 文件中编写我们的爬虫逻辑。 首先,我们需要在 `start_requests` 方法中发起初始请求,获文章列表页的 HTML 内容: ```python import scrapy class BlogSpider(scrapy.Spider): name = 'blog_spider' allowed_domains = ['myblog.com'] start_urls = ['http://myblog.com/articles'] def start_requests(self): for url in self.start_urls: yield scrapy.Request(url=url, callback=self.parse_list) ``` 接下来,我们需要在 `parse_list` 方法中解析文章列表页的 HTML,获每篇文章的 URL,并发起请求获文章详情: ```python def parse_list(self, response): for article in response.css('.article'): article_url = article.css('a::attr(href)').get() yield scrapy.Request(url=article_url, callback=self.parse_article) next_page_url = response.css('a.next-page::attr(href)').get() if next_page_url: yield scrapy.Request(url=next_page_url, callback=self.parse_list) ``` 在上面的代码中,我们使用了 CSS 选择器来获文章列表页中所有文章链接的 URL,并且判断是否有下一页,如果有下一页就继续发起请求获下一页的 HTML 内容。 最后,我们需要在 `parse_article` 方法中解析文章详情的 HTML,提文章的标题和内容: ```python def parse_article(self, response): title = response.css('h1::text').get() content = response.css('.article-content').get() yield { 'title': title, 'content': content, } ``` 这样就完成了一个简单的爬虫,可以通过以下命令运行: ``` scrapy crawl blog_spider ``` 完整的代码如下: ```python import scrapy class BlogSpider(scrapy.Spider): name = 'blog_spider' allowed_domains = ['myblog.com'] start_urls = ['http://myblog.com/articles'] def start_requests(self): for url in self.start_urls: yield scrapy.Request(url=url, callback=self.parse_list) def parse_list(self, response): for article in response.css('.article'): article_url = article.css('a::attr(href)').get() yield scrapy.Request(url=article_url, callback=self.parse_article) next_page_url = response.css('a.next-page::attr(href)').get() if next_page_url: yield scrapy.Request(url=next_page_url, callback=self.parse_list) def parse_article(self, response): title = response.css('h1::text').get() content = response.css('.article-content').get() yield { 'title': title, 'content': content, } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值