1.使用scrapy框架爬取股票数据
2.python爬虫入门,源码10分钟就够了,分析这可能是源码我见过最简单的基础教学
3.spider的用法
4.第二章:URL、HTML、分析XPath和JSON简介
使用scrapy框架爬取股票数据
@概述本例将手把手带大家实现一个使用scrapy框架爬取股票数据的源码例子
我们将同花顺中融资融券中的几只个股的历史数据爬下来,并保存为csv文件(csv格式是分析qt页面源码数据分析最友好的格式)
本例使用到了pileline和中间件middleware
scrapy的安装请参见我博客的其它相关文章
@爬取标的
我们对融资融券对应的相关个股的前三页历史数据爬下来,如图所示:
@创建工程
scrapy startproject mystockspider
@工程结构简介
mystocks/ 工程根目录
mystocks/mystocks/ 工程代码存放目录
scrapy.cfg 部署文件
mystocks/mystocks/spiders/ 爬虫源文件存放目录
mystocks/mystocks/items.py 数据模型模块
mystocks/mystocks/pipelines.py 数据模型处理模块
mystocks/mystocks/middlewares.py 下载中间件模块
mystocks/mystocks/settings.py 设置模块
@在items.py中创建数据模型
#?源码个股数据模型class?StockItem(scrapy.Item):#?股票名称name?=?scrapy.Field()#?股票详细信息data?=?scrapy.Field()@在spiders/目录下创建爬虫源代码my_stock_spider.py
源文件名称和类名称都是任意的
name属性所定义的爬虫名称,将来启动爬虫的分析命令会使用到
start_urls是爬虫开始工作的起始页
#?定义爬虫类class?MyStockSpider(scrapy.Spider):#?定义爬虫名称(命令行启动爬虫要用)name?=?'mystockspider'#?定义起始?urlstart_urls?=?['/']@定义起始页响应的处理函数parse
这里的parse函数的名称和参数都是固定的写法,不可改变,源码可以在IDE中直接通过插入覆写方法实现
#?分析响应处理函数#?response为start_url所返回的响应对象def?parse(self,?response):@首页响应函数的具体实现
这里要做的事情就是从页面超链接中提取出个股名称和详情页超链接
xpath规则请参见:/market/rzrqgg/code/'+response.meta['id']+'/order/desc/page/'?+?str(response.meta['page'])?+?'/ajax/1/'print("url_str?=?",?url_str)#?稍事休息后,爬取下一页数据,源码仍交由当前函数处理time.sleep(1)yield?分析scrapy.Request(url=url_str,callback=self.handle_detail,meta={ 'page':?response.meta['page'],?'url_base':?url_str,?'name':?response.meta['name'],'id':response.meta['id']})
@在pipelines.py中定义数据模型处理类
这里的主要处理逻辑在process_item覆写方法中,
这里的源码处理逻辑很简单,就是分析项目引用netty源码把数据模型中的数据写入对应的文件
结尾处return了数据模型item,return给谁呢,源码答案是下一个pipeliine,如果有的话
#?处理spider返回的item对象class?StockSavingPipeline(object):#?初始化方法def?__init__(self):print("\n"*5,"StockSavingPipeline?__init__")#?处理spider返回的item对象#?item?=?爬虫提交过来的数据模型#?spider?=?提交item的爬虫实例def?process_item(self,?item,?spider):print("\n"?*?5,?"StockSavingPipeline?process_item")#?提取数据data?=?item['data']file_name?=?"./files/"+item['name']+".csv"#?向文件中写入数据with?open(file_name,"a")?as?file:file.write(data)#?如果有多个pipeline,继续向下一个pipeline传递#?不返回则传递终止#?这里主要体现一个分工、分批处理的思想return?item#?对象被销毁时调用def?__del__(self):print("\n"?*?5,?"StockSavingPipeline?__del__")@告诉框架爬虫提交的数据对象由谁处理,这里有两种设置方式
方式1:设置在settings.py中
这里设置了多个pipeline处理类,所有爬虫类提交的所有item都会经过所有这些pipeline类
这些pipeline的处理顺序是从小到大的,即的会先处理,的后处理,其取值范围是0-
ITEM_PIPELINES?=?{ 'myspider.pipelines.WbtcPipeline':?,'myspider.pipelines.WbtcPipeline_2':?,'myspider.pipelines.StockSavingPipeline':?,}方式2:设置在爬虫类中,本例即MyStockSpider类中
直接设置在爬虫类中,其优先级要高于设置在settings.py中
这个规则对于后面对于下载中间件的配置也同样适用
#?声明使用哪些pipelines和下载中间件#?这里设置的优先级要高于settings.py文件custom_settings?=?{ 'ITEM_PIPELINES':{ 'myspider.pipelines.StockSavingPipeline':},}@配置下载中间件
下载中间件的作用是对请求和响应进行预处理
比如对所有请求添加随机的User-Agent
比如对所有请求随机配置代理IP
其配置同样有两种方式:配置在settings.py中或配置在爬虫类中,后者的打字速度源码优先级要高于前者
settings.py中的配置如下:
#?配置下载中间件DOWNLOADER_MIDDLEWARES?=?{ ?#?'myspider.middlewares.MyCustomDownloaderMiddleware':?,?'myspider.middlewares.ProxyMiddleware':?,}爬虫类中的配置如下:
#?声明使用哪些pipelines和下载中间件#?这里设置的优先级要高于settings.py文件custom_settings?=?{ ?'ITEM_PIPELINES':{ 'myspider.pipelines.StockSavingPipeline':},?'DOWNLOADER_MIDDLEWARES':{ 'myspider.middlewares.ProxyMiddleware':?},}@实现下载中间件
这里实现对所有请求添加随机请求头和IP代理
由于中间件同样也是可以配置多个,串联成链式结构的,所以return的标的下一个中间件
#?定义爬虫类class?MyStockSpider(scrapy.Spider):#?定义爬虫名称(命令行启动爬虫要用)name?=?'mystockspider'#?定义起始?urlstart_urls?=?['/']0@命令行中跑起来,爬虫就会源源不断地开始爬了
这里要提前cd到爬虫工程的根目录
如果在linux环境下,可以在前面加sudo,可以避免一些没必要的稀奇古怪的错误
#?定义爬虫类class?MyStockSpider(scrapy.Spider):#?定义爬虫名称(命令行启动爬虫要用)name?=?'mystockspider'#?定义起始?urlstart_urls?=?['/']1原文:/post/
python爬虫入门,分钟就够了,这可能是我见过最简单的基础教学
1.1什么是爬虫
爬虫(spider,又网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序。
从技术层面来说就是通过程序模拟浏览器请求站点的行为,把站点返回的HTML代码/JSON数据/二进制数据(、视频)爬到本地,webrtc源码编译ios进而提取自己需要的数据,存放起来使用。
1.2爬虫基本流程
用户获取网络数据的方式有:浏览器提交请求--->下载网页代码--->解析成页面;或模拟浏览器发送请求(获取网页代码)->提取有用的数据->存放于数据库或文件中。
爬虫要做的就是后者。
1.3发起请求
使用/simple_json...
2.6threading
使用threading模块创建线程,直接从threading.Thread继承,然后重写__init__方法和run方法。
方法实例
3.1get方法实例
demo_get.py
3.2post方法实例
demo_post.py
3.3添加代理
demo_proxies.py
3.4获取ajax类数据实例
demo_ajax.py
3.5使用多线程实例
demo_thread.py
爬虫框架
4.1Srcapy框架
4.2Scrapy架构图
4.3Scrapy主要组件
4.4Scrapy的运作流程
4.5制作Scrapy爬虫4步曲
1新建爬虫项目scrapy startproject mySpider2明确目标 (编写items.py)打开mySpider目录下的items.py3制作爬虫 (spiders/xxspider.py)scrapy genspider gushi " gushi.com"4存储内容 (pipelines.py)设计管道存储爬取内容
常用工具
5.1fidder
fidder是一款抓包工具,主要用于手机抓包。
5.2XPath Helper
xpath helper插件是一款免费的chrome爬虫网页解析工具。可以帮助用户解决在获取xpath路径时无法正常定位等问题。谷歌浏览器插件xpath helper 的安装和使用:jingyan.baidu.com/artic...
分布式爬虫
6.1scrapy-redis
Scrapy-redis是为了更方便地实现Scrapy分布式爬取,而提供了一些以redis为基础的最佳归并树源码组件(pip install scrapy-redis)
6.2分布式策略
经验0基础,怎样学技术赚钱?
对于过年消费太多,想年后用Python开副业多赚点钱,但缺乏兼职经验,也不熟悉爬虫与反爬虫技术的朋友。
推荐一个专业的Python零基础-实战就业专项训练营
金三银四要高薪就业?想涨薪?要跳槽?Python技能包为你助力!本次2天课程将围绕大厂都在使用的爬虫实战数据分析办公自动化仅限前个粉丝免费加入:
福利一:Python入门学习资料+面试宝典一份;
福利二:飞机大战游戏+酷狗音乐爬虫源码;
福利三:+行业岗位数据分布趋势情况。
有需要的小伙伴可以,点击下方插件
spider的用法
python爬虫之spider用法Spider类定义了如何爬取某个网站, 包括爬取的动作以及如何从网页内容中提取结构化的数据, 总的来说spider就是定义爬取的动作以及分析某个网页.
工作流程分析 :
1. 以初始的URLRequest, 并设置回调函数, 当该requeset下载完毕并返回时, 将生成response, 并作为参数传递给回调函数. spider中初始的request是通过start_requests()来获取的. start_requests()获取start_urls中的URL, 并以parse以回调函数生成Request
2. 在回调函数内分析返回的网页内容, 可以返回item对象, 或者Dict,或者Request, 以及是一个包含三者的可迭代的容器, 返回的Request对象之后会经过Scrapy处理, 下载相应的内容, 并调用设置的callback函数.
3. 在回调函数, 可以通过lxml, bs4, xpath, css等方法获取我们想要的内容生成item
4. 最后将item传送给pipeline处理
源码分析 :
在spiders下写爬虫的时候, 并没有写start_request来处理start_urls处理start_urls中的url, 这是因为在继承的scrapy.Spider中已经写过了
在上述源码中可以看出在父类里实现了start_requests方法, 通过make_requests_from_url做了Request请求
上图中, parse回调函数中的response就是父类中start_requests方法调用make_requests_from_url返回的结果, 并且在parse回调函数中可以继续返回Request, 就像代码中yield request()并设置回调函数.
spider内的一些常用属性 :
所有自己写的爬虫都是继承于spider.Spider这个类
name:
定义爬虫名字, 通过命令启动的额时候用的就是这个名字, 这个名字必须唯一
allowed_domains:
包含了spider允许爬取的域名列表. 当offsiteMiddleware启用时, 域名不在列表中URL不会被访问, 所以在爬虫文件中, 每次生成Request请求时都会进行和这里的域名进行判断.
start_urls:
其实的URL列表
这里会通过spider.Spider方法调用start_request循环请求这个列表中的每个地址
custom_settings:
自定义配置, 可以覆盖settings的配置, 主要用于当我们队怕重有特定需求设置的时候
设置的以字典的方式设置: custom_settings = { }
from_crawler:
一个类方法, 可以通过crawler.settings.get()这种方式获取settings配置文件中的信息. 同时这个也可以在pipeline中使用
start_requests():
此方法必须返回一个可迭代对象, 该对象包含了spider用于爬取的第一个Request请求
此方法是在被继承的父类中spider.Spider中写的, 默认是通过get请求, 如果需要修改最开始的这个请求, 可以重写这个方法, 如想通过post请求
make_requests_from_url(url):
此房也是在父类中start_requests调用的, 可以重写
parse(response):
默认的回调函数
负责处理response并返回处理的数据以及跟进的url
该方法以及其他的Request回调函数必须返回一个而包含Request或者item的可迭代对象.
第二章:URL、HTML、XPath和JSON简介
Scrapy是一个用于网络信息请求与提取的强大工具,要熟练使用Scrapy,了解网页的结构和如何有效提取信息是基本前提。一、URL简介
URL(Uniform Resource Locator),统一资源定位符,是互联网上的标准资源地址表示。每一项互联网资源都对应一个唯一的URL,URL分为两部分,首部解析定位目标主机,第二部明确请求主机的资源,如HTML文档、或音乐。二、HTML文档
在浏览器请求页面后,服务器响应的HTML文档是解析页面排版的基础。解析过程实现页面元素的加载、排序,最终在浏览器展示。如百度首页,通过查看网页源代码,能深入HTML文档结构。三、XPath语言
用于在XML文档中定位信息,XPath基于XML树结构,支持元素、属性和文本节点的查找。通过XPath,能便捷地从HTML文档中抽取所需数据,解决正则表达式复杂性。四、XPath应用示例
以获取今日头条的小时热闻为例,利用XPath表达式实现精准元素匹配。五、浏览器中的XPath使用与浏览器插件
Chrome浏览器支持XPath的开发者工具,通过控制台输入XPath表达式即可定位元素。Xpath Helper插件简化了此过程,生成默认的XPath表达式,用户需要进一步优化。六、json介绍与应用
json,轻量级数据交换格式,基于ECMAScript子集,提供简洁高效的数据存储与传输方式。Json类似Python字典,由键值对组成。用于从API接口获取信息,无需浏览网页。七、json的浏览器显示与工具
遇到json格式的数据时,直接在浏览器查看往往不够直观。安装JSON Viewer插件可改进此问题,使json内容的查看和理解更加清晰。八、小结
理解并熟练运用URL、HTML、XPath和json,不仅能够帮助我们高效地从网络上获取和分析所需数据,也能够优化数据处理过程,提升工作效率。