python安装与pycharm中环境结合

环境配置(Windows下配置)

python

本项目使用python3.5以上版本进行开发,到python官方网站下载3.5以上版本,下载链接:https://www.python.org/downloads/

下载好之后进行安装,在安装界面记得勾选上add python 3.6 to path,可以省去手动配置python系统环境

进入控制台输入 :python -V 出现下图情况,说明python安装成功,系统环境也已经配置好了

scrapy

lxml和twisted

该项目主要使用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出现下图情况即说明安装成功

pywin32

windows系统在使用scrapy的时候还需要win32api,下载链接:https://github.com/mhammond/pywin32/releases,根据python版本和windows版本选择相应的文件下载安装

参考链接:

Scrapy安装指南

安装教程:python+win7+Scrapy

python IDE开发环境

参考链接:Windows 安装 Anaconda3,PyCharm。

virtualenv环境

项目使用的是独立环境,项目运行所需的所有环境都配在virtualenv里,详情见virtualenv(python项目搭建独立的Python环境)

通过activate指令进入(venv)环境之后,就可以执行命令安装项目所需的库了,包括scrapy的配置zz

爬虫项目

scrapy框架zx

参考链接:Scrapy入门教程,该链接里详细的介绍了scrapy的使用入门,及相关配置文件的操作,以及简单的xpath样例

xpath使用

谷歌浏览器提供直接从开发者工具获取xpath路径的简便方法,可以使用;也可以尝试通过语法来编写xpath

参考链接:谷歌浏览器获取xpath使用方法

语法教程参考:XPath教程,该教程介绍了xpath的语法及应用实例等

脚本样例模板(静态页面)

scrapy脚本样例 展开源码

selenium + scrapy

scrapy在处理静态页面上功能强大,但是遇到有js动态渲染的页面,就需要selenium来进行处理(Splash也能达到一样的效果,有兴趣的可以百度了解)

selenuim安装配置

python3下,直接可以在venv环境下执行pip3 install selenuim指令进行下载,下载完成后输入pip list有下图所示,说明环境配置selenuim库成功

ChromeDriver安装配置

selenium不自带谷歌浏览器的驱动,需要手动下载,下载ChromeDriver时必须与使用的浏览器版本号相对应;

参考链接:Chrome版本与chromedriver兼容版本对照表

下载链接:ChromeDriver下载地址

下载完成后有两种使用方式可供参考:

1、配置系统环境变量:将ChromeDriver的目录配人系统环境变量下的path下面

2、直接在程序中引用绝对路径:如下图所示

selenium在启动时会根据配置打开相应的浏览器,并在浏览器中模拟页面操作;为了提高爬虫效率,可配置为不打开浏览器,如上图中的option配置

脚本样例模板(Js动态渲染页面)

辽宁省图片信息页面爬取脚本 展开源码

selenium使用中发现的与scrapy的区别

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安装

下载安装包

      Anaconda下载网址:https://repo.continuum.io/archive/ ,根据自己的实际情况,选择合适的版本,下载文件

安装

运行下载的exe文件,进入如下界面。直接点击next进入下一步。

 点击 I Agree

 

 

根据自己决定选择安装all user 还是just me,点击next,进入下一步(如果系统只有一个用户选择默认的第一个即可,如果有多个用户而且都要用到 Anaconda ,则选择第二个选项)。

选择安装目录。。。next进入下一步。

第一个选项是添加环境变量。如果不选择,需要自己手动添加。点击install开始安装。

自此,Anaconda安装完成。测试是否安装成功:进入dos界面,输入python出现如下信息。

pycharm安装

下载安装包

网址: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,如图:

 

 

virtualenv(python项目搭建独立的Python环境)

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文本,属性等。

 

loader.add_xpath("description"'/html/body/div[3]/div[3]/div[3]/div[1]/div[2]/div[2]/div/text()')

loader.add_xpath("tags"'//*[@id="home"]/div/div[2]/div[1]/div/a/text()')

loader.add_xpath("album"'//*[@id="home"]/div/div[2]/div[2]/a/text()')

loader.add_xpath("status"'/html/body/div[3]/div[3]/div[3]/div[1]/div[2]/div[3]/div/span/text()')

loader.add_xpath("scale"'/html/body/div[3]/div[3]/div[3]/div[1]/div[2]/div[3]/div/h3[2]/span/text()')

loader.add_xpath("alias"'//*[@id="home"]/div/div[1]/div/div[2]/div[1]/span/h1/@data-fullname')

接口获取页面获取

通过url访问网站接口,直接获取数据的方式,json形式。

try:

    payload = json.loads(response.body)

    meta = response.meta['maxima']

 

    if not meta:

        logging.warning("Item is missing...")

    else:

        loader = ItemLoader(item=MaximaItem(), response=response)

        loader.add_value("id", meta["id"])

        loader.add_value("url", response.url)

        loader.add_value("name", meta["name"])

        loader.add_value("com_prov", meta["com_prov"])

        maxima = loader.load_item()

        yield maxima

except JSONDecodeError:

    logging.warning("Failed to convert response body to json")

    exit(4)

jsonp获取

通过url访问网站接口,数据以jsonp的形式返回,需要对jsonp进行一次处理,如下(部分python片段),处理后可以获取到接口中的数据,再进行处理。

import execjs

jsonp = response.body.decode('utf8')

= jsonp[jsonp.index("("+ 1: jsonp.rindex(")")]

list_detail = execjs.eval(j)

ajax异步获取

网站中难免会有很多显示的内容是通过ajax异步加载的,此时就需要单独处理。

防反爬机制

IP地址池或者动态代理

使用代理接口,在middleware层获取动态代理。(或者配置ip地址池,随机使用)

随机User-Agent

在settings文件中配置多个UA,在middleware层实现随机获取。

针对网站设置合适的请求数

针对网站设置合适的等待时间

# Configure maximum concurrent requests performed by Scrapy (default: 16)

CONCURRENT_REQUESTS = 16

 

# Configure a delay for requests for the same website (default: 0)

# See https://doc.scrapy.org/en/latest/topics/settings.html#download-delay

# See also autothrottle settings and docs

DOWNLOAD_DELAY = 0

# The download delay setting will honor only one of:

CONCURRENT_REQUESTS_PER_DOMAIN = 16

抓取效率

共享cookies

类似IT桔子这种需要账号的付费网站,如果要使用同一账号同时进行多任务抓取,就需要携带统一cookies或者其他认证信息。将这些认证信息集中存储在一台机器的redis数据库中,进行统一管理。

scrapyd和scrapyd-client

python管理scrapy项目的依赖scrapyd。scrapyd是一个部署和启动爬虫的应用。可以参考这里:

windows安装使用scrapyd部署调度scrapy爬虫任务

scrapyd文档

scrapyd可以调度,启动,取消spider。同时提供了日志查询,任务查询,items,以及状态查询等接口

spiderkeeper

spiderkeeper是一个deploy项目,管理spiders,调度爬虫任务,统计爬虫信息的一个工具。简单的说就是把scrapyd提供的功能,api接口和scrapyd-client的deploy等进行了一层封装,通过部署服务,实现了在浏览器上部署爬虫项目,启动爬虫任务,查看状态等内容。

Cookies处理

问题背景

       对于需要登录,才能访问站内其余页面的网站来说,一个账号同一时间,只能有一个cookies。当在浏览器使用的账号和项目中使用的账号相同时,由于浏览器中进行了登录(会有一个cookies配置),当启动程序进行数据抓取时,程序首先处理的就是登录问题!一旦程序进行了登录,该账号就会产生一个新的cookies。这就导致无法在浏览器上再使用该一个账号进行访问。(根本原因,账号收费才能查看数据)
实现目标
       实现程序和浏览器访问可以同时进行的功能。(背后的原理就是使用同一套cookies,当然不能多个浏览器同时登录,或者多个人同时使用一个账号登录,因为这个过程中始终会出现一个最新的cookies,致使其余机器,或者说其余的浏览方式无法进行,不管是程序无法进行,还是浏览器无法浏览,都对开发产生了极大的限制)。
       实现多台机器多个任务同时执行。(也是使用同一套cookies)

简单的思路

  1. Cookie的处理,调研一下从浏览器直接导出cookie给爬虫使用(比如使用chrome的cookies.txt扩展):将cookies的一个配置文件,导入到系统中,实际上就是读取cookies配置,在程序中携带cookie直接进行网站访问。细节:这种模式下,代码需要绕过登录逻辑,避免重新请求获取新的cookies。(程序兼容两种模式,一种就是程序和浏览器可以同时使用,这个时候,在spider中把cookies带上,直接去访问数据页面,此时就需要绕过登录。如果没有这种需求,就是走原来的登录逻辑,登录,抓取)
  2. 全局控制Cookie,避免多个爬虫任务使用Cookie的时候出现冲突(通过1中导入的cookie):需要注意的一点:在启动爬虫任务时,进行密码修改,避免其余同事在不知情的情况下登录访问。

重新设计爬虫输出文件格式,对应后续文件处理机制

问题背景

为了将爬虫与入库两个部分分离开来。也为了更好的将数据进行存档,便于管理,或者满足客户使用

  1. 设计文件输出目录的配置(考虑分布式情况,后续文件解析需要多机进行文件拉取)
  2. 增加一个统计sheet:时间,爬行任务信息,文件中数据量。在读写数据的时候能够正确处理这个sheet,文件解析程序引入一些简单校验

爬虫输出文件解析程序:

  1. 考虑从不同服务器上拉取文件
  2. 记录文件处理结果:
    1. 防止重复处理
    2. 记录处理结果
    3. 扩展一下记录表记录一下对应的文件

改进一下IT桔子的爬行功能,增加“新增”爬取,只关注新增的各种数据


1. 修改现有逻辑(适当重构),在列表页处理的时候加上检查,获取详情页请求url,和数据库进行比对,只抓取网站新增的数据;
2. 加上redis作为缓存,把整个requests.seen的逻辑放到redis里面去,具体考虑设置不同的刷新周期。
3.短期不进行频繁的数据全量抓取,只进行数据的补充。间隔一定时间进行一次数据的全量抓取。(设计不同的抓取模式)

自动化爬取

  1. 怎么定时,调研一下scrapyd有没有定时任务(出一个调研结果)2 day;
  2. 万一出问题,要能够通知到责任人(这个是自动恢复吗?)
  3. 还能够人工触发

爬虫程序抓取的数据,是直接入库还是采取其他的方式,例如文件固化的形式。

直接入库,意味着要在爬取数据的过程中,进行数据入库。

每一次数据抓取都设置版本号来进行数据的版本管理。因为每一次抓取都是全量数据的抓取,历史数据也需要进行保存留存,所以数据需要进行一个版本管理。

添加了时间戳和版本号等附加信息。

关于版本号,之前的讨论是以年份月份来进行控制,一个月交付的数据就是一个版本。这其中要考虑到的问题:

1.数据量,当一次抓取的数据量不是真个网站完整的数据时,需要进行再次抓取。这就需要维护好requests.seen文件。以及程序代码dont_filter的相应设置。

2.如何判断一条数据的版本号,如果库里没有该数据,则版本号是指定版本号,如果存在,版本号需要根据具体情况相应设置。但是这个过程中就避免不了要进行数据查询。以此来判断数据是新增还是更新(一个月内的多次抓取)。

3.多个模块互相捆绑在一起。抓取和入库。应该分开,彼此互不影响。抓取的过程中进行大量的数据库访问,程序的抓取速度,性能等都有较大的影响。

4.目前公司的服务器压力比较大,服务器磁盘满了会导致数据库出问题,此外数据库也有可能崩掉,还有网络因素影响着数据抓取,一旦抓取和入库一方出现问题,爬虫任务都会失败。

目前,整理完善导出数据的模板,还是将数据以文件格式存储。

第一,有数据存档。

第二,可能会有结果文件的需求

第三,整理文档进行统一入库,环节上更加简单。

有考虑,可继续补充...

你可能感兴趣的:(Python)