所有程序文件均在压缩包中,本文对各个文件作用及如何使用进行说明,文件具体内容参见程序内注释。程序文件后缀为.py,可以用任意编辑器打开,包括记事本,建议用安装python自带的idle或其他带有语法高亮的编辑器打开。
文件结构
文件夹中包含文件夹tutorial,文件db_proxy.db,get_proxy_from_kuai.py。其中tutorial中包含爬虫文件(这个名字是因为我在学的时候按照教程直接输的),get_proxy_from_kuai.py用于爬取代理网址,从网站http://www.66ip.cn 的自动提取接口获取,感兴趣的可以看一下这个文件,db_proxy.db是存储爬取的代理信息的数据库文件,这个文件可以用sqlite expert打开查看(实际使用中直接用python读取文件,数据库操作可以参见获取代理的程序文件)。
tutorial下有spider文件夹和其他一些文件,spider是存放爬虫文件的,其他文件主要是一些配置文件等,我们用到的主要有settings.py,middlewares.py,分别是设置文件和中间件文件(用于更换代理)。
spiders中包含四个文件,其中init.py不用管,items.py是存储item类的文件,item的作用为:
Item 是保存爬取到的数据的容器;其使用方法和python字典类似, 并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。
剩下两个文件是主体文件,分别为二手房爬取程序和小区爬取程序。
使用方式
要在自己电脑上运行这些程序,首先要安装python,然后安装需要用到的一些库,包括scrapy,requests,sqlite3,beautifulsoup4,关于库的说明及安装方式可以参照这个链接,建议安装一个好的集成开发环境(ide),我用的是pythonxy,自带一个spyder编辑器,自动补全还算不错,另外就是会。当然也可以用python自带的idle编辑。
scrapy程序需要在命令行中运行,所以运行时需要打开命令行切换到文件所在目录,windows下切换目录的方式参见该链接,当然如果和我一样安装了pythonxy的话在文件浏览器中右键就会有一个选项:open enhanced console here,即打开一个命令行窗口,且位置在这里。
之后就可以运行了,命令是scrapy crawl Lianjia_Ershou -o name.csv。其中scrapy是主命令,crawl表示运行一个爬虫,Lianjia_Ershou是爬虫名,在程序中定义,-o表示将结果输出到文件,name.csv是输出的目标文件。
网络相关的一些基础知识
首先关于访问网页的一个基本流程:1、客户端向服务端发起请求,请求中可能包含一些数据(类似于用户名等)。2、服务端验证用户端信息并返回数据。3、客户端对数据进行处理得到最终呈现的网页。这个过程中我们最关注的是如何在第二步中让服务端认为我们不是爬虫,下面是一个典型的请求:
主要关注右边,上面是请求,下面是服务器的应答,请求中我们需要关注的时user-agent,这个字段表示用户是以什么客户端访问的,这张图里面我是抓的chrome访问链家的包,所以该字段是 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36,如果我是用python简单的发送一个请求的话该字段就是空的。一些网站会简单的以这个来判断是否爬虫,另外一个重要的就是cookies,这个是网站用来标记用户的字段,链家在一个ip大量访问后会屏蔽该ip,然后弹出验证页面,验证通过后可以继续访问,但是只是浏览器可以继续访问,除非在python发送请求时加上网站交给浏览器的cookies,当然因为我们通过换ip的方式回避,所以不用理会这个。
其他一些常见的反爬虫策略及应对措施参见下面这个链接
其他注意事项
在程序抓取并验证代理是否可用时采用了多线程,关于多线程的情况参见链接
程序中一些地方用到了正则表达式,参见链接
程序中在请求传递过程中用到了meta参数,对于这个东西说明如下:meta相当于request的一个参数,通过request.meta访问,它本身是一个字典,用于传递信息。
网络会用数字返回访问结果,例如404等,这些数字含义参见链接,其中3开头的是重定向,严格来说这并不是一种错误,但是链家在判断用户为异常流量后会指向验证页面,即返回302,因此对于这个状态码也重试,而不是取访问异常流量验证页面
在程序中会看到很多yield而不是return,关于yield参见链接,简单来说yield就是在程序运行到相应位置时暂停并返回一个东西,而后再次运行而不是像return一样直接停止程序。