Scrapy爬取知名技术文章网站
scrapy安装和配置
virtualenvwrapper管理虚拟环境
virtualenvwrapper
这个软件包可以让我们管理虚拟环境变得更加简单。不用再跑到某个目录下通过virtualenv
来创建虚拟环境,并且激活的时候也要跑到具体的目录下去激活。
安装virtualenvwrapper:
*nix
:pip install virtualenvwrapper。windows
:pip install virtualenvwrapper-win。
virtualenvwrapper
基本使用:
- 创建虚拟环境:
mkvirtualenv my_env
那么会在你当前用户下创建一个Env
的文件夹,然后将这个虚拟环境安装到这个目录下。如果你电脑中安装了python2
和python3
,并且两个版本中都安装了virtualenvwrapper
,那么将会使用环境变量中第一个出现的Python
版本来作为这个虚拟环境的Python
解释器。 - 切换到某个虚拟环境:
workon my_env
- 退出当前虚拟环境:
deactivate
- 删除某个虚拟环境:
rmvirtualenv my_env
- 列出所有虚拟环境:
lsvirtualenv
- 进入到虚拟环境所在的目录:
cdvirtualenv
修改mkvirtualenv
的默认路径:
在我的电脑->右键->属性->高级系统设置->环境变量->系统变量
中添加一个参数WORKON_HOME
,将这个参数的值设置为你需要的路径。
创建虚拟环境的时候指定Python
版本:
在使用mkvirtualenv
的时候,可以指定--python
的参数来指定具体的python
路径:mkvirtualenv --python==C:\Python36\python.exe hy_env
scrapy的安装
使用豆瓣源安装scrapy:pip install -i https://pypi.douban.com/simple/ scrapy
补充
进入虚拟环境: workon py3scrapy
创建项目: scrapy startproject ArticleSpider
需要进入到项目路径下cd ArticleSpider
,才能建立spider: scrapy genspider jobbole news.cnblogs.com
设置项目的虚拟环境:
pycharm中调试scrapy源码
运行爬虫文件
建立一个main.py
文件,在ArticleSpider
文件目录下
1 |
|
os.path.abspath(__file__)
#获取main.py
目录地址dirname()
#获取main.py
父目录
调试程序
pass位置设置断点,可以调试出爬虫数据。
xpath基础语法
xpath语法
表达式 | 说明 |
---|---|
article | 选取所有article元素的所有子节点 |
/article | 选取跟元素article |
article/a | 选取所有article元素的所有子元素a元素 |
//div | 选取所有div元素(不论出现在文档任何地方) |
article//div | 选取所有属于article元素的后代的div元素,不管它出现在article之下的任何位置 |
//@class | 选取所有名为class的属性 |
/article/div[1] | 选取属于article子元素的第一个div元素 |
/article/div[last()] | 选取属于article子元素的最后一个div元素 |
/article/div[last()-1] | 选取属于article子元素的倒数第二个div元素 |
//div[@lang] | 选取所有拥有lang属性的div元素 |
//div[@lang=’eng’] | 选取所有拥有lang属性为eng的div元素 |
/div/* | 选取所有属于div元素的所有子节点 |
//* | 选取所有元素 |
补充内容
xpath写对了,但是获取到的内容与网页呈现出的不一致。F12产生的源码,不同于网页源代码,前者可能是js
加载完的源代码。response.xpath()
是根据网页源代码来提取信息的。
contains()
用法
1 |
|
scrapy shell 调试url,如:scrapy shell https://www.cnblogs.com/
1 |
|
xpath提取元素
1 |
|
css选择器
表达式 | 说明 |
---|---|
* | 选择所有节点 |
#container | 选择id为container的节点 |
.container | 选取所有class包含container的节点 |
li a | 选取所有li下的所有a节点 |
ul + p | 选取ul后面的第一个p元素 |
div #container > ul | 选取id为container的div的ul子元素 |
p~ul | 选择前面有 元素的每个
|
a[title] | 选取所有有title属性的a元素 |
a[href = “http://javami.com"] | 选取所有href属性为javami.com值的a元素 |
a[href* = “jobole”] | 选取所有href属性包含jobole的a元素 |
a[href^ = “http”] | 选取所有href属性以http开头的a元素 |
a[href$ = “.jpg”] | 选取所有href属性以.jpg结尾的a元素 |
input[type=radio]:checked | 选择选中的radio的元素 |
div:not[#container] | 选取所有id非container的div属性 |
li:nth-child(3)] | 选取第三个li元素 |
tr:nth-child(2n)] | 第偶数个tr |
1 |
|
编写spider完成抓取过程
http带则不加,不带则加上写法
1 |
|
获取文章列表页中的文章url并交给scrapy下载后并进行解析
1 |
|
scrapy中为什么要使用yield
1 |
|
提取详情页信息
1 |
|
items的定义和使用
在items.py模块下创建JobBoleArticleItem类
1 |
|
在jobble.py模块下引入JobBoleArticleItem类
1 |
|
在项目文件夹下创建子文件夹utils,写一个MD5生成类(common.py)
1 |
|
settings.py的设置问题
不遵守robots.txt协议
1 |
|
有关于pipelines的设置,需要打开项目管道
1 |
|
pipelines.py项目管道
1 |
|
scrapy配置图片下载
settings.py设置配置文件,就会自动下载图片
1 |
|
配置图片默认下载路径
1 |
|
安装图片下载处理库pillow:pip install -i https://pypi.douban.com/simple pillow
在pipelines.py模块下重载图片方法
1 |
|
因为重写了ArticleImagesPipeline,所以需要在设置中更改过来:
1 |
|
items数据写入到json文件中
数据保存都会放在piplines.py模块下处理
自定义json文件的导出
1 |
|
在settings.py中配置ITEM_PIPELINES
1 |
|
调用scrapy提供的json export导出json文件
数据保存都会放在piplines.py模块下处理
1 |
|
在settings.py中配置ITEM_PIPELINES
1 |
|
mysql表结构设计
安装mysql的一个驱动(mysqlclient)
1 |
|
mysql表结构设计,并且设置字符集
pipeline数据库保存
采用同步的机制写入mysql
数据保存都会放在piplines.py模块下处理
1 |
|
在settings.py中配置ITEM_PIPELINES
1 |
|
异步方式入库mysql
使用twisted将mysql插入变成异步执行
1 |
|
在settings.py中配置ITEM_PIPELINES和数据库信息
1 |
|
数据插入主键冲突的解决方法
ON DUPLICATE KEY UPDATE(当insert已经存在的记录时,执行Update)
1 |
|
一旦parise_nums值存在,就更新该值的数值。
itemloader提取信息
处理逻辑为item_loader保存网页提取到的css字段或者value字段,通过items.py模块对字段进行定制化筛选
引入ArticleItemLoader类
1 |
|
items.py模块下继承ItemLoader的基类item中定义一些规则
Item Loader 为每个 Item Field 单独提供了一个 Input processor
和一个 Output processor
;
Input processor 一旦它通过 add_xpath()
,add_css()
,add_value()
方法收到提取到的数据便会执行,执行以后所得到的数据将仍然保存在 ItemLoader 实例中;当数据收集完成以后,ItemLoader 通过 load_item()
方法来进行填充并返回已填充的 Item 实例。
即input_processor
是在收集数据的过程中所做的处理,output_processor
是数据yield
之后进行的处理
1 |
|
大规模抓取图片下载出错的问题
避免获取到空字符串
1 |
|
避免图片地址不一致
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!