Python之CrawlSpider
2023-03-07 09:40:33 时间
CrawlSpider继承自scrapy.Spider
CrawlSpider
可以定义规则,再解析html
内容的时候,可以根据链接规则提取出指定的链接,然后再向这些链接发送请求所以,如果有需要跟进链接的需求,意思就是爬取了网页之后,需要提取链接再次爬取,使用CrawlSpider是非常合适的
提取链接
链接提取器,在这里就可以写规则提取指定链接
scrapy.linkextractors.LinkExtractor(
-
allow = (),
# 正则表达式 提取符合正则的链接 -
deny = (),
# (不用)正则表达式 不提取符合正则的链接 -
allow_domains = (),
# (不用)允许的域名 -
deny_domains = (),
# (不用)不允许的域名 -
restrict_xpaths = (),
# xpath,提取符合xpath规则的链接 -
restrict_css = ()
# 提取符合选择器规则的链接)
示例:
正则用法:links1 = LinkExtractor(allow=r'list_23_\d+\.html')
xpath用法:links2 = LinkExtractor(restrict_xpaths=r'//div[@class="x"]')
css用法:links3 = LinkExtractor(restrict_css='.x')
提取连接:
link.extract_links(response)
注意事项
【注1】callback只能写函数名字符串, callback='parse_item'
【注2】在基本的spider
中,如果重新发送请求,那里的callback
写的是 callback=self.parse_item
,follow=true
是否跟进 就是按照提取连接规则进行提取
案例
1.创建项目:scrapy startproject scrapy_crawlspider
2.跳转到spiders
路径 cd\scrapy_crawlspider\scrapy_crawlspider\spiders
3.创建爬虫类:scrapy genspider ‐t crawl read www.dushu.com
read.py
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy_crawlspider.items import ScrapyCrawlspiderItem
class ReadSpider(CrawlSpider):
name = 'read'
allowed_domains = ['www.dushu.com']
start_urls = ['https://www.dushu.com/book/1188_1.html']
rules = (
Rule(LinkExtractor(allow=r'/book/1188_\d+.html'),
callback='parse_item',
follow=False),
)
def parse_item(self, response):
img_list = response.xpath('//div[@class="bookslist"]//img')
for img in img_list:
name = img.xpath('./@data-original').extract_first()
src = img.xpath('./@alt').extract_first()
if name == None:
name = img.xpath('./@src').extract_first()
print(name + src)
book = ScrapyCrawlspiderItem(name=name, src=src)
yield book
follow为True代表一直跟下去,直到没有页数,为False代表之爬取1-13页
items.py
class ScrapyCrawlspiderItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
name = scrapy.Field()
src = scrapy.Field()
pipelines.py
class ScrapyCrawlspiderPipeline:
def open_spider(self, spider):
self.fp = open('book.json', 'w', encoding='utf-8')
def process_item(self, item, spider):
self.fp.write(str(item))
return item
def close_spider(self, spider):
self.fp.close()
settings.py开启管道
ITEM_PIPELINES = {
'scrapy_crawlspider.pipelines.ScrapyCrawlspiderPipeline': 300
}
数据入库
首先安装pip isntall pymysql
1、settings配置参数
#
DB_HOST = '127.0.0.1'
# 端口号是一个整数
DB_PORT = 3306
DB_USER = 'root'
DB_PASSWROD = '123456'
DB_NAME = 'py_bd'
# utf-8的杠不允许写
DB_CHARSET = 'utf8'
# 开启管道
ITEM_PIPELINES = {
'scrapy_crawlspider.pipelines.ScrapyCrawlspiderPipeline': 300
'scrapy_crawlspider.pipelines.MysqlPipeline': 301,
}
2、管道配置
# 加载settings文件
from scrapy.utils.project import get_project_settings
import pymysql
class MysqlPipeline:
def open_spider(self, spider):
settings = get_project_settings()
self.host = settings['DB_HOST']
self.port = settings['DB_PORT']
self.user = settings['DB_USER']
self.password = settings['DB_PASSWROD']
self.name = settings['DB_NAME']
self.charset = settings['DB_CHARSET']
self.connect()
def connect(self):
self.conn = pymysql.connect(
host=self.host,
port=self.port,
user=self.user,
password=self.password,
db=self.name,
charset=self.charset
)
self.cursor = self.conn.cursor()
def process_item(self, item, spider):
# 数据库提前建好这张表
sql = 'insert into test_book(name,src) values("{}","{}")'.format(item['name'], item['src'])
# 执行sql语句
self.cursor.execute(sql)
# 提交
self.conn.commit()
return item
def close_spider(self, spider):
self.cursor.close()
self.conn.close()
相关文章
- 图像处理工具Python扩展库,你了解吗?
- 十个常用的损失函数解释以及Python代码实现
- 30 个数据科学工作中必备的 Python 包
- 如何在 Windows 上安装 Python
- 几行 Python 代码就可以提取数百个时间序列特征
- 使用Python快速搭建接口自动化测试脚本实战总结
- 哪种编程语言最适合开发网页抓取工具?
- 不要在 Python 中使用循环,这些方法其实更棒!
- 震惊!用Python探索《红楼梦》的人物关系!
- 如何最简单、通俗地理解Python模块?
- 酷炫,Python实现交通数据可视化!
- 为什么急于寻找Python的替代者?
- 30 个数据工程必备的Python 包
- 去字节面试被面这题能答上来吗?谈谈你对时间轮的理解?
- 火山引擎在行为分析场景下的 ClickHouse JOIN 优化
- 用Python爬取了某宝1166家月饼数据进行可视化分析,终于找到最好吃的月饼~
- 在 Linux 上试试这个基于 Python 的文件管理器
- Python列表解析式到底该怎么用?
- 如何快速把你的 Python 代码变为 API
- 十个Python初学者常犯的错误