爬虫笔记八——Scrapy实战项目
(案例一)手机App抓包爬虫
1. items.py
import scrapyclass DouyuspiderItem(scrapy.Item):# 存储照片的名字 nickName = scrapy.Field()# 照片的url路径 imageUrl = scrapy.Field()# 照片保存在本地的路径 imagePath = scrapy.Field()
items
2. spiders/douyu.py
# -*- coding: utf-8 -*-import scrapyfrom douyuSpider.items import DouyuspiderItemimport jsonclass DouyuSpider(scrapy.Spider):name = 'douyu'allowed_domains = ['capi.douyucdn.cn']offset = 0url = "http://capi.douyucdn.cn/api/v1/getVerticalRoom?limit=20&offset="start_urls = [url + str(offset)]def parse(self, response):data = json.loads(response.body)["data"]for each in data:item = DouyuspiderItem()item["nickName"] = each["nickname"]item["imageUrl"] = each["vertical_src"]yield itemself.offset += 20nextUrl = re.sub('offset=\d+', 'offset='+str(self.offset), response.url)yield scrapy.Request(nextUrl, callback=self.parse)
spiders/douyu.py
3. 设置setting.py
DEFAULT_REQUEST_HEADERS = {'User-Agent': 'News 6.6.5 rv:6.6.5.03 (iPhone; iOS 11.2.6; zh_CN) Cronet'}ITEM_PIPELINES = {'douyuSpider.pipelines.DouyuspiderPipeline': 300,}IMAGES_STORE = 'E:\Python\Spider\day05\douyuSpider\images'# 日志文件名和处理等级 LOG_FILE = "douyu.log"LOG_LEVEL = "DEBUG"
setting
4. pipelines.py
# -*- coding: utf-8 -*-import scrapyfrom scrapy.exceptions import DropItemfrom scrapy.utils.project import get_project_settingsfrom scrapy.pipelines.images import ImagesPipelineimport osclass DouyuspiderPipeline(ImagesPipeline):IMAGES_STORE = get_project_settings().get("IMAGES_STORE")# 根据图片的url生成图片的Requestdef get_media_requests(self, item, info):image_url = item["imageUrl"]yield scrapy.Request(image_url)# 图片下载完毕之后,处理结果会以二元组的方式作为results参数传递给item_completed函数# 这个二元组定义如下:(success, image_info_or_failure),第一个元素表示图片是否下载成功,第二个元素是一个字典# 字典的含义如下:{'url': 图片的url, 'path': 图片的存储地址,跟IMAGE_STORE相关, 'checksum': 图片的内容hash}def item_completed(self, results, item, info):# 如果图片下载成功,则获取图片的存储地址 image_path = [x["path"] for ok, x in results if ok]#print image_pathif not image_path:raise DropItem("Item contains no images")# 修改图片的存储地址: os.rename(self.IMAGES_STORE + "\\" + image_path[0], self.IMAGES_STORE + "\\" + item["nickName"] + ".jpg")item["imagePath"] = self.IMAGES_STORE + "\\" + item["nickName"]#print item["imagePath"]return item
pipelines
5. 运行
在项目根目录下新建main.py文件,用于调试from scrapy import cmdlinecmdline.execute("scrapy crawl douyu".split())执行程序python main.py
5.2. (案例二)阳光热线问政平台爬虫
阳光热线问政平台
http://wz.sun0769.com/index.php/question/questionType?type=4
爬取投诉帖子的编号、帖子的url、帖子的标题,和帖子里的内容。
import scrapyclass DongguanspiderItem(scrapy.Item):# 每个帖子的标题 title = scrapy.Field()# 每个帖子的编号 number = scrapy.Field()# 每个帖子的文字内容 content = scrapy.Field()# 每个帖子的url url = scrapy.Field()
items.py
spiders/sunwz.py
# -*- coding: utf-8 -*- import scrapy from dongguanSpider.items import DongguanspiderItemclass DongguanSpider(scrapy.Spider):name = 'dongguan'allowed_domains = ['sun0769.com']url = 'http://wz.sun0769.com/index.php/question/questionType?type=4&page='headers = {"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}offset = 0start_urls = [url + str(offset)]# 解析每个页面的响应def parse(self, response):# 获取每页帖子的链接列表links = response.xpath('//div[@class="greyframe"]/table//td/a[2]/@href').extract()for link in links:# 获取每个帖子的Request请求yield scrapy.Request(link, headers=self.headers, callback=self.parse_item)# 设置页码终止条件为最后一页的page值,if self.offset <= 88560:self.offset += 30# 获取每页的Request请求yield scrapy.Request(self.url + str(self.offset), headers=self.headers, callback=self.parse)# 解析页面里的每个帖子的响应def parse_item(self, response):item = DongguanspiderItem()titleList = response.xpath('//div[contains(@class, "pagecenter p3")]//strong/text()')[0].extract().strip().split()# 帖子的标题item['title'] = titleList[0][3:]# 帖子的编号item['number'] = titleList[1][3:]# 帖子的内容,先取出有图片帖子的内容,再取出没有图片帖子的内容content = response.xpath('//div[@class="contentext"]/text()').extract()if len(content) == 0:content = response.xpath('//div[@class="c1 text14_2"]/text()').extract()item['content'] = "".join(content).strip()else:item['content'] = "".join(content).strip()# 帖子的链接地址item['url'] = response.urlyield item
Spider版本
# -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from dongguanSpider.items import DongguanspiderItemclass SunSpider(CrawlSpider):name = 'sun'allowed_domains = ['sun0769.com']start_urls = ['http://wz.sun0769.com/index.php/question/questionType?type=4&page=']# 每页链接的匹配规则pageLink = LinkExtractor(allow=('type=4'))# 每个帖子链接的匹配规则contentLink = LinkExtractor(allow=r'/html/question/\d+/\d+.shtml')rules = (Rule(pageLink),Rule(contentLink, callback='parse_item'))def parse_item(self, response): item = DongguanspiderItem()titleList = response.xpath('//div[contains(@class, "pagecenter p3")]//strong/text()')[0].extract().strip().split()# 帖子的标题item['title'] = titleList[0][3:]# 帖子的编号item['number'] = titleList[1][3:]# 帖子的内容,先取出有图片帖子的内容,再取出没有图片帖子的内容content = response.xpath('//div[@class="contentext"]/text()').extract()if len(content) == 0:content = response.xpath('//div[@class="c1 text14_2"]/text()').extract() # content为列表,通过join方法拼接字符串,并去除首尾空格item['content'] = "".join(content).strip()else:item['content'] = "".join(content).strip()# 帖子的链接地址item['url'] = response.urlyield item
CrawlSpider 版本
pipelines.py
# -*- coding: utf-8 -*-# 文件处理类库,可以指定编码格式 import codecs import jsonclass DongguanspiderPipeline(object):def __init__(self):# 创建一个可写文件,指定编码格式为utf-8self.filename = codecs.open('dongguan.json', 'w', encoding='utf-8')def process_item(self, item, spider):content = json.dumps(dict(item), ensure_ascii=False) + '\n'self.filename.write(content)return itemdef spider_closed(self, spider):self.filename.close()
pipelines.py
settings.py
ITEM_PIPELINES = {'dongguanSpider.pipelines.DongguanspiderPipeline': 300, }# 日志文件名和处理等级 LOG_FILE = "dg.log" LOG_LEVEL = "DEBUG"
settings
在项目根目录下新建main.py文件,用于调试from scrapy import cmdlinecmdline.execute("scrapy crawl sun".split())执行程序py2 main.py
5.3. (案例三)新浪网页分类资讯爬虫
爬取新浪网导航页所有分类下所有大类、小类、小类里的子链接,以及子链接页面的新闻内容。
效果演示图:
items.py
import scrapyclass SinaspiderItem(scrapy.Item):# 大类的标题 parentTitle = scrapy.Field()# 大类的url parentUrl = scrapy.Field()# 小类的标题 subTitle = scrapy.Field()# 小类的url subUrl = scrapy.Field()# 小类的存储路径 subDir = scrapy.Field()# 文章的url fileUrl = scrapy.Field()# 文章的标题 title = scrapy.Field()# 文章的内容 content = scrapy.Field() spiders/sina.py # -*- coding: utf-8 -*-import scrapyfrom sinaSpider.items import SinaspiderItemimport osclass SinaSpider(scrapy.Spider):name = 'sina'allowed_domains = ['sina.com.cn']start_urls = ['http://news.sina.com.cn/guide/']# 解析首页def parse(self, response):# 获取大类的标题列表 parentTitleList = response.xpath('//div[@id="tab01"]//h3/a/text()').extract()# 获取大类的url列表 parentUrlList = response.xpath('//div[@id="tab01"]//h3/a/@href').extract()# 遍历大类列表for i in range(len(parentTitleList)):# 根据大类的标题名新建目录 parentDir = '.\\Data\\' + parentTitleList[i]if not os.path.exists(parentDir):os.makedirs(parentDir)# 获取每个大类下的小类的标题列表 subTitleList = response.xpath('//div[@id="tab01"]/div[{}]//li/a/text()'.format(i+1)).extract()# 获取每个大类下的小类的url列表 subUrlList = response.xpath('//div[@id="tab01"]/div[{}]//li/a/@href'.format(i+1)).extract()# 遍历某一个大类下的小类列表for j in range(len(subTitleList)):# 根据小类的标题名新建目录 subDir = parentDir + '\\'+ subTitleList[j]if not os.path.exists(subDir):os.makedirs(subDir)item = SinaspiderItem()item['parentTitle'] = parentTitleList[i]item['parentUrl'] = parentUrlList[i]item['subTitle'] = subTitleList[j]item['subUrl'] = subUrlList[j]item['subDir'] = subDir# 发送每个小类的Request请求,在Request中加入meta,即可将meta传递给response作为参数给回调函数使用yield scrapy.Request(item['subUrl'], meta={'meta_1': item}, callback=self.parse_news)# 解析每个小类的url,爬取每个小类下的文章标题和链接def parse_news(self, response):# 获取Request请求发送的meta_1参数 meta_1 = response.meta['meta_1']fileUrlList = response.xpath('//a/@href').re(r'.*\d+\.shtml')for i in range(len(fileUrlList)):item = SinaspiderItem()item['parentTitle'] = meta_1['parentTitle']item['parentUrl'] = meta_1['parentUrl']item['subTitle'] = meta_1['subTitle']item['subUrl'] = meta_1['subUrl']item['subDir'] = meta_1['subDir']item['fileUrl'] = fileUrlList[i]# 发送每篇新闻的Request请求,在Request中加入meta,向回调函数parse_content传递参数meta2yield scrapy.Request(item['fileUrl'], meta={'meta_2': item}, callback=self.parse_content)# 解析每个新闻页,获取新闻标题和内容def parse_content(self, response):# 获取Request请求发送的meta_2参数 item = response.meta['meta_2']# 获取新闻的标题 title = response.xpath('//h1[@class="main-title"]/text()')[0].extract()content = ''contentList = response.xpath('//div[@class="article"]/p/text()').extract()# 获取新闻的内容for content_one in contentList:content += content_oneitem['title'] = titleitem['content'] = contentyield item
items
pipelines.py
class SinaspiderPipeline(object):def process_item(self, item, spider):fileUrl = item['fileUrl']# 根据新闻链接地址命名存储新闻的文件名 fileName = item['subDir'] + '\\' + fileUrl[7:-6].replace('/', '_') + '.txt'with open(fileName, 'w') as f:f.write(item['content'].encode('utf-8'))return item
piplines
settings.py
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"ITEM_PIPELINES = {'sinaSpider.pipelines.SinaspiderPipeline': 300,}# 日志文件名和处理等级 LOG_FILE = "sina.log"LOG_LEVEL = "DEBUG"
settings
在项目根目录下新建main.py文件,用于调试from scrapy import cmdlinecmdline.execute("scrapy crawl sina".split())执行程序py2 main.py
转载于:https://www.cnblogs.com/Mint-diary/p/9707308.html
爬虫笔记八——Scrapy实战项目相关推荐
- Python 网络爬虫笔记11 -- Scrapy 实战
Python 网络爬虫笔记11 – Scrapy 实战 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:Py ...
- 爬虫笔记八----selenium
爬虫笔记八 来自风变编程 在爬虫过程中,我们还可能会遇到各种各样棘手的问题-- 有的网站登录很复杂,验证码难以破解,比如大名鼎鼎的12306. 有的网站页面交互复杂,所使用的技术难以被爬取,比如,腾讯 ...
- Python 网络爬虫笔记10 -- Scrapy 使用入门
Python 网络爬虫笔记10 – Scrapy 使用入门 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接: ...
- Python 网络爬虫笔记9 -- Scrapy爬虫框架
Python 网络爬虫笔记9 – Scrapy爬虫框架 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:Py ...
- PYTHON 爬虫笔记十一:Scrapy框架的基本使用
Scrapy框架详解及其基本使用 scrapy框架原理 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为 ...
- 【爬虫笔记】Scrapy爬虫技术文章网站
文章目录 一.Xpath 1.xpath简介 2.xpath语法 二.CSS选择器 三.爬取伯乐在线--初级 1.创建Scrapy项目 2.编写item.py文件 3.编写spider文件 4.编写p ...
- Python:Scrapy实战项目手机App抓包爬虫
1. items.py class DouyuspiderItem(scrapy.Item):name = scrapy.Field()# 存储照片的名字imagesUrls = scrapy.Fie ...
- scrapy实战项目(简单的爬取知乎项目)
本项目实现了对知乎用户信息的爬取,并没有用数据库等,只是简单地用一些提取了一些字段然后存储在了一个csv文件中,但是同样可以实现无线爬取,理论上可以实现万级数据的爬取(当然取决于网速了) 其实想爬取知 ...
- 实战项目 78 : 从 Web API 获取数据
这篇文章分享我的 Android 开发(入门)课程 的第七个和第八个实战项目:书籍列表应用和新闻应用.这两个项目都托管在我的 GitHub 上,分别是 BookListing 和 NewsApp 这两 ...
最新文章
- ospf多区域配置为什么ping不通_「实战」动态路由多区域 OSPF 基本配置,一分钟了解下...
- Boost:基于Boost的发送者和接收者的测试程序
- Linux读写执行(RWX)权限
- pvbrowser安装教程(Linux)
- latex图片标题居中
- js字符串slice_JavaScript子字符串示例-JS中的Slice,Substr和Substring方法
- MEncoder 使用实例
- git rebase用法_Git:Clone别人的代码之后push到自己码云上失败的解决办法
- SQLplus 和mysql区别_mysql和oracle的区别有哪些
- Linux性能分析之网络篇
- MDT2010学习(八),MDT结合WDS部署Win7 x86企业版
- 快慢指针(Fast and Slow Pointers)
- 中国裁判文书网全网最新爬虫分析
- 个人职业生涯规划书-职业生涯规划书
- 项目实训(十三)安装pun,pun的基础使用和概念
- Java Web安全之代码审计
- java常用算法之冒泡排序简单例子
- CSS 文本超出溢出显示省略号...
- 单芯片如何实现升压和降压?
- 漏洞解决方案-SQL注入攻击
热门文章
- C++ Primer 第五版 第6章 6.3——函数返回类型和return语句阅读笔记
- java hook全局钩子,牛逼骚操作:Java 虚拟机关闭钩子(Shutdown Hook)!
- Bezier(贝塞尔)曲线的轨迹规划在自动驾驶中的应用(三)
- 传统emmc所用的sdio接口_SolidGear SD/SDIO/eMMC协议分析仪
- 2字节取值范围_高中数学:构造不等式,解析几何范围题的有效解法
- DIoU Loss论文阅读
- 用python实现朴素贝叶斯算法_朴素贝叶斯算法 python 实现
- python调用扫描仪_使用Python编写简单的端口扫描器的实例分享
- excel python插件_如何利用Excel与Python制作PPT
- 吴恩达深度学习笔记 2.6~2.9 logistic中的梯度下降