(案例一)手机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实战项目相关推荐

  1. Python 网络爬虫笔记11 -- Scrapy 实战

    Python 网络爬虫笔记11 – Scrapy 实战 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:Py ...

  2. 爬虫笔记八----selenium

    爬虫笔记八 来自风变编程 在爬虫过程中,我们还可能会遇到各种各样棘手的问题-- 有的网站登录很复杂,验证码难以破解,比如大名鼎鼎的12306. 有的网站页面交互复杂,所使用的技术难以被爬取,比如,腾讯 ...

  3. Python 网络爬虫笔记10 -- Scrapy 使用入门

    Python 网络爬虫笔记10 – Scrapy 使用入门 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接: ...

  4. Python 网络爬虫笔记9 -- Scrapy爬虫框架

    Python 网络爬虫笔记9 – Scrapy爬虫框架 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:Py ...

  5. PYTHON 爬虫笔记十一:Scrapy框架的基本使用

    Scrapy框架详解及其基本使用 scrapy框架原理 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为 ...

  6. 【爬虫笔记】Scrapy爬虫技术文章网站

    文章目录 一.Xpath 1.xpath简介 2.xpath语法 二.CSS选择器 三.爬取伯乐在线--初级 1.创建Scrapy项目 2.编写item.py文件 3.编写spider文件 4.编写p ...

  7. Python:Scrapy实战项目手机App抓包爬虫

    1. items.py class DouyuspiderItem(scrapy.Item):name = scrapy.Field()# 存储照片的名字imagesUrls = scrapy.Fie ...

  8. scrapy实战项目(简单的爬取知乎项目)

    本项目实现了对知乎用户信息的爬取,并没有用数据库等,只是简单地用一些提取了一些字段然后存储在了一个csv文件中,但是同样可以实现无线爬取,理论上可以实现万级数据的爬取(当然取决于网速了) 其实想爬取知 ...

  9. 实战项目 78 : 从 Web API 获取数据

    这篇文章分享我的 Android 开发(入门)课程 的第七个和第八个实战项目:书籍列表应用和新闻应用.这两个项目都托管在我的 GitHub 上,分别是 BookListing 和 NewsApp 这两 ...

最新文章

  1. ospf多区域配置为什么ping不通_「实战」动态路由多区域 OSPF 基本配置,一分钟了解下...
  2. Boost:基于Boost的发送者和接收者的测试程序
  3. Linux读写执行(RWX)权限
  4. pvbrowser安装教程(Linux)
  5. latex图片标题居中
  6. js字符串slice_JavaScript子字符串示例-JS中的Slice,Substr和Substring方法
  7. MEncoder 使用实例
  8. git rebase用法_Git:Clone别人的代码之后push到自己码云上失败的解决办法
  9. SQLplus 和mysql区别_mysql和oracle的区别有哪些
  10. Linux性能分析之网络篇
  11. MDT2010学习(八),MDT结合WDS部署Win7 x86企业版
  12. 快慢指针(Fast and Slow Pointers)
  13. 中国裁判文书网全网最新爬虫分析
  14. 个人职业生涯规划书-职业生涯规划书
  15. 项目实训(十三)安装pun,pun的基础使用和概念
  16. Java Web安全之代码审计
  17. java常用算法之冒泡排序简单例子
  18. CSS 文本超出溢出显示省略号...
  19. 单芯片如何实现升压和降压?
  20. 漏洞解决方案-SQL注入攻击

热门文章

  1. C++ Primer 第五版 第6章 6.3——函数返回类型和return语句阅读笔记
  2. java hook全局钩子,牛逼骚操作:Java 虚拟机关闭钩子(Shutdown Hook)!
  3. Bezier(贝塞尔)曲线的轨迹规划在自动驾驶中的应用(三)
  4. 传统emmc所用的sdio接口_SolidGear SD/SDIO/eMMC协议分析仪
  5. 2字节取值范围_高中数学:构造不等式,解析几何范围题的有效解法
  6. DIoU Loss论文阅读
  7. 用python实现朴素贝叶斯算法_朴素贝叶斯算法 python 实现
  8. python调用扫描仪_使用Python编写简单的端口扫描器的实例分享
  9. excel python插件_如何利用Excel与Python制作PPT
  10. 吴恩达深度学习笔记 2.6~2.9 logistic中的梯度下降