练手练到阅文集团作家中心了,python crawlspider 二维抓取学习

梦想橡皮擦 2021-10-25 19:23:46
练手 集团 文集 练到 团作

本篇博客学习使用 CrawlSpider 进行二维抓取。

目标站点分析

本次要采集的目标站点为:阅文集团作家中心
练手练到阅文集团作家中心了,python crawlspider 二维抓取学习

分页地址具备一定规则,具体如下:

https://write.qq.com/portal/article?filterType=0&page={页码}

由于本文重点学习内容为简单操作 scrapy 实现爬虫,所以目标详情页仅提取标题即可。

知识说明

本篇博客生成爬虫文件,使用 scrapy genspider -t crawl yw write.qq.com,默认生成的代码如下所示:

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class CbSpider(CrawlSpider):
name = 'yw'
allowed_domains = ['write.qq.com']
start_urls = ['https://write.qq.com/portal/article?filterType=0&page=1']
rules = (
Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),
)
def parse_item(self, response):
item = {
}
#item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
#item['name'] = response.xpath('//div[@id="name"]').get()
#item['description'] = response.xpath('//div[@id="description"]').get()
return item

其中 CrawlSpider 继承自 Spider ,派生该类的原因是为了简化爬取编码,其中增加了类属性 rules ,其值为Rule 对象的集合元组,用于匹配目标网站并排除干扰。

rules = (
Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),
)

** Rule 类的构造函数原型如下**

Rule(link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=None)

参数说明如下:

  • link_extractor:LinkExtractor 对象,定义了如何从爬取到的页面提取链接;
  • callback:回调函数,也可以是回调函数的字符串名。接收 Response 对象作为参数,返回包含 Item 或者 Request 对象列表;
  • cb_kwargs:用于作为 **kwargs 参数,传递给 callback
  • follow:布尔值,默认是 False,用于判断是否继续从该页面提取链接;
  • process_links:指定该 spider 中哪个函数将会被调用,从 link_extractor 中获取到链接列表后悔调用该函数,该方法主要用来过滤 url;
  • process_request:回调函数,也可以是回调函数的字符串名。用来过滤 Request ,该规则提取到每个 Request 时都会调用该函数。

** LinkExtractor 类构造函数原型如下**

LinkExtractor(allow=(), deny=(), allow_domains=(), deny_domains=(), restrict_xpaths=(), tags=('a', 'area'),
attrs=('href',), canonicalize=False, unique=True, process_value=None, deny_extensions=None,
restrict_css=(), strip=True, restrict_text=None,
)

其中比较重要的参数如下所示:

  • allow:正则表达式,满足的会被提取,默认为空,表示提取全部超链接;
  • deny:正则表达式,不被提取的内容;
  • allow_domains:允许的 domains;
  • deny_domains:不允许的 domains;
  • restrict_xpaths:xpath 表达式
  • tags:提取的标签;
  • attrs:默认属性值;
  • restrict_css:css 表达式提取;
  • restrict_text:文本提取。

编码时间

rules 变量中,设置两个 URL 提取规则。

# URL 提取规则
rules = (
Rule(LinkExtractor(allow=r'.*/portal/content\?caid=\d+&feedType=2&lcid=\d+$'), callback="parse_item"),
# 寻找下一页 url 地址
Rule(LinkExtractor(restrict_xpaths="//a[@title='下一页']"), follow=True),
)

代码重点在寻找下一页部分,使用的是 restrict_xpaths 方法,即基于 xpath 提取,原因是由于使用正则表达式提取下一页地址,写起来略微繁琐。
第一个 Rule 规则是获取内容详情页数据,回调函数 callbackparse_item

完整代码如下所示:

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class CbSpider(CrawlSpider):
name = 'yw'
allowed_domains = ['write.qq.com']
start_urls = ['https://write.qq.com/portal/article?filterType=0&page=1']
# URL 提取规则
rules = (
Rule(LinkExtractor(allow=r'.*/portal/content\?caid=\d+&feedType=2&lcid=\d+$'), callback="parse_item"),
# 寻找下一页 url 地址
Rule(LinkExtractor(restrict_xpaths="//a[@title='下一页']"), follow=True),
)
def parse_item(self, response):
print("测试输出")
print(response.url)
title = response.css('title::text').extract()[0]
print(title)
item = {
}
# item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
# item['name'] = response.xpath('//div[@id="name"]').get()
# item['description'] = response.xpath('//div[@id="description"]').get()
return item

编写完毕,在 settings.py 文件中修改如下内容:

ROBOTSTXT_OBEY = False # 关闭 robots.txt 文件请求
LOG_LEVEL = 'WARNING' # 调高日志输出级别

最后得到的结果如下所示。
练手练到阅文集团作家中心了,python crawlspider 二维抓取学习

知识再次补充

CrawlSpider 的派生类中,你还可以重写如下方法:

  • parse_start_url():在采集前对 start_urls 进行覆盖修改;
  • process_results():数据返回时进行再次加工,该函数需要配合 callback 参数设定的函数使用。
def parse_start_url(self, response):
print("---process_results---")
yield scrapy.Request('https://write.qq.com/portal/article?filterType=0&page=1')
def process_results(self, response, results):
print("---process_results---")
print(results)
def parse_item(self, response):
print("---parse_item---")
print(response.url)
title = response.css('title::text').extract()[0].strip()
item = {
}
item["title"] = title
yield item

写在后面

今天是持续写作的第 248 / 365 天。
期待 关注点赞评论收藏

更多精彩

《爬虫 100 例,专栏销售中,买完就能学会系列专栏》
从前有一个网站叫"在行",今天拿它练练Python爬虫

↓ ↓ ↓ ↓完整代码↓ ↓ ↓ ↓
版权声明
本文为[梦想橡皮擦]所创,转载请带上原文链接,感谢
https://dream.blog.csdn.net/article/details/120835220

  1. 安装opcv时,按照步骤,opencv-python和numpy显示已经存在,检测时还是不成功是怎么回事?
  2. Il y a eu une erreur de connexion en utilisant la Bibliothèque Python Modbus tk.
  3. python如何实现tornado handler的复用?
  4. Python绘制Excel图表
  5. python的循环的问题的解决
  6. python 这样的问题怎么解决
  7. python 這樣的問題怎麼解决
  8. Comment résoudre un problème comme Python
  9. Python函数式编程系列012:惰性列表之生成器与迭代器
  10. Python代码阅读(第22篇):从源字典映射出新字典
  11. python怎么生成这样的数组啊?
  12. Python must not have additive thinking to make money!
  13. Python代码阅读(第22篇):从源字典映射出新字典
  14. Comparison of Python small knowledge objects
  15. 推荐各类编程语言的IDE集成开发工具:Java、PHP、web、Python等
  16. Python重启时出现内核错误,请问如何解决?
  17. python进阶(21)typing模块--类型提示支持
  18. python进阶(21)typing模块--类型提示支持
  19. Python 整除运算 输出三位数百位以上数字
  20. python用字典设计一个程序录入学生课业的提交情况
  21. Python的多任务编程
  22. Python Advanced (21) Typing module - - type prompt support
  23. Error debugging is accurate to line, match case pattern matching... The official version of Python 3.10 is really friendly
  24. Introduction to machine learning: 7000 word detailed Python environment installation
  25. Comparison of Python small knowledge objects
  26. Python的多任務編程
  27. 用vscode来debug多个python文件问题
  28. Programmation multitâche en python
  29. Python utilise un dictionnaire pour concevoir un programme pour saisir les présentations des étudiants
  30. 用vscode來debug多個python文件問題
  31. Déboguer plusieurs problèmes de fichiers python avec vscode
  32. L'opération de division d'entiers Python produit plus de trois chiffres et des centaines de chiffres
  33. python 加密-对exe加密
  34. [Python] dixtra algorithm
  35. PYTHON贝叶斯推断计算:用BETA先验分布推断概率和可视化案例
  36. python中如何用递归实现二进制转十进制
  37. python中如何用遞歸實現二進制轉十進制
  38. Comment implémenter le binaire à la décimale en python avec récursion
  39. Python Bayesian Inference Calculation: Inference Probability and Visualization Case Using Beta precedent distribution
  40. Python+selenium 实现自动上传并发布好看短视频实例演示
  41. Python + sélénium implémente le téléchargement automatique et la publication d'une démonstration d'instance vidéo courte et belle
  42. Python爬虫能当副业吗?到了哪个层次能接单?解析能挣钱的方式
  43. 大佬今天教你用python制作五款简单又好玩的小游戏
  44. Les reptiles Python peuvent - ils être une entreprise secondaire? À quel niveau les commandes peuvent - elles être reçues? Analyse des moyens de gagner de l'argent
  45. Python+微信小程序开发(五)for指令和上传图片
  46. Python+微信小程序开发(四)页面跳转和获取用户信息
  47. Python+微信小程序开发(三)开发小程序及页面布局
  48. If I had these resources when I first learned python, I wouldn't have been tortured for so long!
  49. If you want to learn Python well, [container / iteratable object / iterator / generator] must learn Python steadily!
  50. 用Python定义一个函数用于比较两个数并返回较大的数
  51. 用Python定義一個函數用於比較兩個數並返回較大的數
  52. Définir une fonction en python pour comparer deux nombres et renvoyer un nombre plus grand
  53. python自定义错误self.args是什么意思
  54. Que signifie Python Custom Error self.args
  55. 用python编写一个用n填充列表的程序
  56. 用python編寫一個用n填充列錶的程序
  57. Écrivez un programme qui remplit la liste avec n en python
  58. 你需要知道的 20 个 Python 技巧
  59. Python development learning how to quickly enter the programming industry
  60. 20 conseils Python que vous devez connaître