环境配置(Windows下配置)
本项目使用python3.5以上版本进行开发,到python官方网站下载3.5以上版本,下载链接:https://www.python.org/downloads/
下载好之后进行安装,在安装界面记得勾选上add python 3.6 to path,可以省去手动配置python系统环境
进入控制台输入 :python -V 出现下图情况,说明python安装成功,系统环境也已经配置好了
该项目主要使用python的scrapy框架来进行爬虫脚本的开发,安装scrapy之前需先下载并安装两个文件lxml.whl和twisted.whl,下载链接:http://www.lfd.uci.edu/~gohlke/pythonlibs/
根据python版本和windows版本选择相应的文件下载
安装wheel模块:pip3 install whell
找到下载文件的对应目录安装lxml和twisted:
pip3 install path/lxml-4.2.5-cp36-cp36m-win_amd64.whl (path为文件路径)
pip3 install path/Twisted-18.9.0-cp36-cp36m-win_amd64.whl (path为文件路径)
最后安装scrapy即可:pip3 install scrapy
输入scrapy version出现下图情况即说明安装成功
windows系统在使用scrapy的时候还需要win32api,下载链接:https://github.com/mhammond/pywin32/releases,根据python版本和windows版本选择相应的文件下载安装
参考链接:
Scrapy安装指南
安装教程:python+win7+Scrapy
参考链接:Windows 安装 Anaconda3,PyCharm。
项目使用的是独立环境,项目运行所需的所有环境都配在virtualenv里,详情见virtualenv(python项目搭建独立的Python环境)
通过activate指令进入(venv)环境之后,就可以执行命令安装项目所需的库了,包括scrapy的配置zz
参考链接:Scrapy入门教程,该链接里详细的介绍了scrapy的使用入门,及相关配置文件的操作,以及简单的xpath样例
谷歌浏览器提供直接从开发者工具获取xpath路径的简便方法,可以使用;也可以尝试通过语法来编写xpath
参考链接:谷歌浏览器获取xpath使用方法
语法教程参考:XPath教程,该教程介绍了xpath的语法及应用实例等
scrapy脚本样例 展开源码
scrapy在处理静态页面上功能强大,但是遇到有js动态渲染的页面,就需要selenium来进行处理(Splash也能达到一样的效果,有兴趣的可以百度了解)
python3下,直接可以在venv环境下执行pip3 install selenuim指令进行下载,下载完成后输入pip list有下图所示,说明环境配置selenuim库成功
selenium不自带谷歌浏览器的驱动,需要手动下载,下载ChromeDriver时必须与使用的浏览器版本号相对应;
参考链接:Chrome版本与chromedriver兼容版本对照表
下载链接:ChromeDriver下载地址
下载完成后有两种使用方式可供参考:
1、配置系统环境变量:将ChromeDriver的目录配人系统环境变量下的path下面
2、直接在程序中引用绝对路径:如下图所示
selenium在启动时会根据配置打开相应的浏览器,并在浏览器中模拟页面操作;为了提高爬虫效率,可配置为不打开浏览器,如上图中的option配置
辽宁省图片信息页面爬取脚本 展开源码
1、通过xpath获取属性值的区别:
scrapy中直接可以通过response.xpath('//div[@id="zoom"]//a/@href')来获取a标签的href属性值;
而在selenium中有单独的获取属性值的方法get_attribute,相达到与scrapy相同的效果就应该写为find_element_by_xpath('//div[@id="zoom"]//a).get_attribute("href")
2、xpath处理找不到的元素时:
scrapy中通过xpath定位不到元素的话,response.xpath()会返回一个NONE值,并不影响程序运行;
selenium中通过xpath定位不到元素,程序会直接报错并跳出,如果有后续程序需要运行,就需要通过try来捕获处理;
virtualenv环境下,执行pip install scrapy 报错
1、virtualenv环境下,执行pip install scrapy 报错。
之后在滚动鼠标时,发现刚开始执行时就已经报了一个“Failed building wheel for Twisted”的错误。于是进入https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml下载对应的Twisted版本,
执行pip install “文件路径+下载的完整文件名”,安装成功后,
执行pip install scrapy成功。
Windows 安装 Anaconda3,PyCharm。
Anaconda下载网址:https://repo.continuum.io/archive/ ,根据自己的实际情况,选择合适的版本,下载文件
运行下载的exe文件,进入如下界面。直接点击next进入下一步。
点击 I Agree
根据自己决定选择安装all user 还是just me,点击next,进入下一步(如果系统只有一个用户选择默认的第一个即可,如果有多个用户而且都要用到 Anaconda ,则选择第二个选项)。
选择安装目录。。。next进入下一步。
第一个选项是添加环境变量。如果不选择,需要自己手动添加。点击install开始安装。
自此,Anaconda安装完成。测试是否安装成功:进入dos界面,输入python出现如下信息。
网址:https://www.jetbrains.com/pycharm/ ,根据自己的操作系统,选择合适的版本下载。
运行下载的exe文件,出现下面的界面,点击next,进入下一步。
选择安装目录--->next
选择安装的类型,有32位和64位两种,根据自己电脑的位数选择安装。点击next,到下一步。
默认就行。点击install,安装。
安装结束。需要激活,这里采用的是激活码方式激活。也可以自行百度,用其他方式激活。
运行安装好的软件,活出现激活页面,选择activation code。用此方法需要在Windows的C:\Windows\System32\drivers\etc目录下的hosts文件中添加0.0.0.0 account.jetbrains.com,如图:
1.首先安装virtualenv,如果python版本是python3以上,使用pip3 install virtualenv(在当前项目目录下)
2.进入项目目录下,输入virtualenv --no-site-packages venv,添加参数--no-site-packages 这样已经安装到系统的python环境中的第三方包都不会复制过来,这样就得到一个不带任何第三方包的“干净”的python环境。
3.windows进入该环境
4.deactivate 退出环境
linux进入环境
关于爬虫的一些内容:
使用框架scrapy
目前常见的几种数据采集形式:通过页面结合xpath获取;接口获取(多是json);jsonp获取数据;异步ajax
访问的url返回的结果是html页面,根据xpath,css selector等方式选择页面中的标签,然后再获取对应的text文本,属性等。
|
通过url访问网站接口,直接获取数据的方式,json形式。
|
通过url访问网站接口,数据以jsonp的形式返回,需要对jsonp进行一次处理,如下(部分python片段),处理后可以获取到接口中的数据,再进行处理。
|
网站中难免会有很多显示的内容是通过ajax异步加载的,此时就需要单独处理。
使用代理接口,在middleware层获取动态代理。(或者配置ip地址池,随机使用)
在settings文件中配置多个UA,在middleware层实现随机获取。
|
类似IT桔子这种需要账号的付费网站,如果要使用同一账号同时进行多任务抓取,就需要携带统一cookies或者其他认证信息。将这些认证信息集中存储在一台机器的redis数据库中,进行统一管理。
python管理scrapy项目的依赖scrapyd。scrapyd是一个部署和启动爬虫的应用。可以参考这里:
windows安装使用scrapyd部署调度scrapy爬虫任务
scrapyd文档
scrapyd可以调度,启动,取消spider。同时提供了日志查询,任务查询,items,以及状态查询等接口
spiderkeeper是一个deploy项目,管理spiders,调度爬虫任务,统计爬虫信息的一个工具。简单的说就是把scrapyd提供的功能,api接口和scrapyd-client的deploy等进行了一层封装,通过部署服务,实现了在浏览器上部署爬虫项目,启动爬虫任务,查看状态等内容。
对于需要登录,才能访问站内其余页面的网站来说,一个账号同一时间,只能有一个cookies。当在浏览器使用的账号和项目中使用的账号相同时,由于浏览器中进行了登录(会有一个cookies配置),当启动程序进行数据抓取时,程序首先处理的就是登录问题!一旦程序进行了登录,该账号就会产生一个新的cookies。这就导致无法在浏览器上再使用该一个账号进行访问。(根本原因,账号收费才能查看数据)
实现目标
实现程序和浏览器访问可以同时进行的功能。(背后的原理就是使用同一套cookies,当然不能多个浏览器同时登录,或者多个人同时使用一个账号登录,因为这个过程中始终会出现一个最新的cookies,致使其余机器,或者说其余的浏览方式无法进行,不管是程序无法进行,还是浏览器无法浏览,都对开发产生了极大的限制)。
实现多台机器多个任务同时执行。(也是使用同一套cookies)
为了将爬虫与入库两个部分分离开来。也为了更好的将数据进行存档,便于管理,或者满足客户使用
1. 修改现有逻辑(适当重构),在列表页处理的时候加上检查,获取详情页请求url,和数据库进行比对,只抓取网站新增的数据;
2. 加上redis作为缓存,把整个requests.seen的逻辑放到redis里面去,具体考虑设置不同的刷新周期。
3.短期不进行频繁的数据全量抓取,只进行数据的补充。间隔一定时间进行一次数据的全量抓取。(设计不同的抓取模式)
爬虫程序抓取的数据,是直接入库还是采取其他的方式,例如文件固化的形式。
直接入库,意味着要在爬取数据的过程中,进行数据入库。
每一次数据抓取都设置版本号来进行数据的版本管理。因为每一次抓取都是全量数据的抓取,历史数据也需要进行保存留存,所以数据需要进行一个版本管理。
添加了时间戳和版本号等附加信息。
1.数据量,当一次抓取的数据量不是真个网站完整的数据时,需要进行再次抓取。这就需要维护好requests.seen文件。以及程序代码dont_filter的相应设置。
2.如何判断一条数据的版本号,如果库里没有该数据,则版本号是指定版本号,如果存在,版本号需要根据具体情况相应设置。但是这个过程中就避免不了要进行数据查询。以此来判断数据是新增还是更新(一个月内的多次抓取)。
3.多个模块互相捆绑在一起。抓取和入库。应该分开,彼此互不影响。抓取的过程中进行大量的数据库访问,程序的抓取速度,性能等都有较大的影响。
4.目前公司的服务器压力比较大,服务器磁盘满了会导致数据库出问题,此外数据库也有可能崩掉,还有网络因素影响着数据抓取,一旦抓取和入库一方出现问题,爬虫任务都会失败。
目前,整理完善导出数据的模板,还是将数据以文件格式存储。
第一,有数据存档。
第二,可能会有结果文件的需求
第三,整理文档进行统一入库,环节上更加简单。
有考虑,可继续补充...