大学生创新创业网站开发,许昌seo推广,seo顾问服务四川,地产公司网站建设计划书1 scrapy解析数据 1.1 使用css选择器解析数据 1.2 xpath 解析数据
2 配置文件 3 整站爬取博客–》爬取详情–》数据传递
scrapy 爬虫框架补充
# 1 打码平台---》破解验证码-数字字母#xff1a;ddddocr-计算题#xff0c;滑块#xff0c;成语。。。-云打码#xff0c;超…1 scrapy解析数据 1.1 使用css选择器解析数据 1.2 xpath 解析数据
2 配置文件 3 整站爬取博客–》爬取详情–》数据传递
scrapy 爬虫框架补充
# 1 打码平台---》破解验证码-数字字母ddddocr-计算题滑块成语。。。-云打码超级鹰demo---》request携带图片发送请求# 2 通过打码平台登录打码平台-浏览器 缩放调100%-mac 坐标都乘以2# 3 自动登录(京东12306)---》扫码登录---》拿到二维码---》在本地把二维码弹出来让用户扫码可能有很多手机---》每个手机扫一遍---》登录很多账号---》存到cookie池中---》给其他程序用# 4 12306抢票-没有任何第三方 是官方授权的抢票---》第三方全是爬虫-高铁管家只有一个好用---跨站搜索-登录---》输入你的用户名和密码--1 加载了12306网页 2 用户名密码输入---》拿到你的cookie-cookie池2000条cookie-有些登录才能访问的接口随机从cookie拿一条cookie-候补补票# 4 selenium 爬取京东商品信息-需要登录
# 5 scrapy 爬虫框架
# 6 架构引擎爬虫调度器下载器存储pipline# 命令scrapy startproject 项目名scrapy genspider 爬虫名 爬取地址scrapy crawl 爬虫# 目录结构 1 scrapy解析数据
##### 运行爬虫
scrapy crawl cnblogs##### 可以项目目录下写个main.py
from scrapy.cmdline import execute
execute([scrapy,crawl,cnblogs,--nolog])#### 重点
1 response对象有css方法和xpath方法-css中写css选择器 response.css()-xpath中写xpath选择 response.xpath()
2 重点1-xpath取文本内容.//a[contains(class,link-title)]/text()-xpath取属性.//a[contains(class,link-title)]/href-css取文本a.link-title::text-css取属性img.image-scale::attr(src)
3 重点2.extract_first() 取一个.extract() 取所有1.1 使用css选择器解析数据 def parse(self, response):article_list response.css(article.post-item)# print(type(article_list)) # class scrapy.selector.unified.SelectorListfor article in article_list:title article.css(a.post-item-title::text).extract_first()# print(name)author article.css(a.post-item-authorspan::text).extract_first()# print(author)url article.css(a.post-item-title::attr(href)).extract_first()img article.css(img.avatar::attr(src)).extract_first()desc article.css(p.post-item-summary::text).extract() # 文本内容可能放在第二个位置desc_content desc[0].replace(\n, ).replace( , )if not desc_content:desc_content desc[1].replace(\n, ).replace( , )print(f文章标题{title}文章作者{author}链接地址{url}图片{img}文章摘要{desc_content}) 1.2 xpath 解析数据 def parse(self, response):article_list response.xpath(//article[classpost-item])for article in article_list:name article.xpath(.//a[classpost-item-title]/text()).extract_first()# name article.xpath(./section/div/a/text()).extract_first()author article.xpath(.//a[classpost-item-author]/span/text()).extract_first()url article.xpath(.//a[classpost-item-title]/href).extract_first()img article.xpath(./section/div/p/a/img/src).extract_first()desc article.xpath(./section/div/p/text()).extract() # 文本内容可能放在第二个位置desc_content desc[0].replace(\n, ).replace( , )if not desc_content:desc_content desc[1].replace(\n, ).replace( , )print(文章标题%s文章作者%s文章地址%s头像%s摘要%s % (name, author, url, img, desc_content))2 配置文件
#### 基础配置
# 项目名
BOT_NAME scrapy_demo
# 爬虫所在路径
SPIDER_MODULES [scrapy_demo.spiders]
NEWSPIDER_MODULE scrapy_demo.spiders# 记住 日志级别
LOG_LEVELERROR# 请求头中的 USER_AGENT
USER_AGENT Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36# 是否遵循爬虫协议
ROBOTSTXT_OBEY False# 默认请求头
#DEFAULT_REQUEST_HEADERS {
# Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8,
# Accept-Language: en,
#}#爬虫中间件
#SPIDER_MIDDLEWARES {
# scrapy_demo.middlewares.ScrapyDemoSpiderMiddleware: 543,
#}# 下载中间件
#DOWNLOADER_MIDDLEWARES {
# scrapy_demo.middlewares.ScrapyDemoDownloaderMiddleware: 543,
#}# 持久化相关
#ITEM_PIPELINES {
# scrapy_demo.pipelines.ScrapyDemoPipeline: 300,
#}### 高级配置提高爬取效率
#1 增加并发默认16
默认scrapy开启的并发线程为32个可以适当进行增加。在settings配置文件中修改
CONCURRENT_REQUESTS 100
值为100,并发设置成了为100#2 提高日志级别
在运行scrapy时会有大量日志信息的输出为了减少CPU的使用率。可以设置log输出信息为INFO或者ERROR即可。在配置文件中编写
LOG_LEVEL INFO# 3 禁止cookie
如果不是真的需要cookie则在scrapy爬取数据时可以禁止cookie从而减少CPU的使用率提升爬取效率。在配置文件中编写
COOKIES_ENABLED False# 4 禁止重试
对失败的HTTP进行重新请求重试会减慢爬取速度因此可以禁止重试。在配置文件中编写
RETRY_ENABLED False# 5 减少下载超时
如果对一个非常慢的链接进行爬取减少下载超时可以能让卡住的链接快速被放弃从而提升效率。在配置文件中进行编写
DOWNLOAD_TIMEOUT 10 超时时间为10s3 整站爬取cnblogs–》爬取详情–》数据传递
# 整站爬取爬取所有页-解析出下一页 yield Request(urlnext, callbackself.parse)爬取文章详情-解析出详情地址yield Request(urlurl, callbackself.detail_parser)多个Request之间数据传递yield Request(urlurl,meta{item:item})在解析的 response中 response.meta.get(item)def parse(self, response):article_list response.xpath(//article[classpost-item])for article in article_list:name article.xpath(.//a[classpost-item-title]/text()).extract_first()# name article.xpath(./section/div/a/text()).extract_first()author article.xpath(.//a[classpost-item-author]/span/text()).extract_first()url article.xpath(.//a[classpost-item-title]/href).extract_first()img article.xpath(./section/div/p/a/img/src).extract_first()desc article.xpath(./section/div/p/text()).extract() # 文本内容可能放在第二个位置desc_content desc[0].replace(\n, ).replace( , )if not desc_content:desc_content desc[1].replace(\n, ).replace( , )# print(# 文章标题%s# 文章作者%s# 文章地址%s# 头像%s# 摘要%s# % (name, author, url, img, desc_content))# 详情地址url ----》想继续爬取详情item{name:name,url:url,img:img,text:None}yield Request(urlurl, callbackself.detail_parser,meta{item:item})#### 继续爬取下一页# nexthttps://www.cnblogs.comresponse.css(div.pagera:last-child::attr(href)).extract_first()next https://www.cnblogs.com response.xpath(//div[classpager]/a[last()]/href).extract_first()print(next)yield Request(urlnext, callbackself.parse)# 逻辑---》起始地址https://www.cnblogs.com---》回到了parse---》自己解析了打印数据继续爬取的地址---》yield Request对象---》第二页---》爬完后又回到parser解析def detail_parser(self, response):print(len(response.text))itemresponse.meta.get(item)textresponse.css(#cnblogs_post_body).extract_first()item[text]text# 我们想把上一个请求解析出来的 标题摘要图片 和这个请求解析出来的 文本合并到一起# 这个text 无法和 上面 parse解析出的文章标题对应上print(item)