Skip to main content

Python爬虫相关笔记

前段时间尝试用爬虫做个差评信息平台“MUSEE”,对折腾Python爬虫的一些过程记录下。

资源调研

资源调研主要是做对于要爬的线上数据进行调研,弄清楚站点的URL、数据链接、数据标签等,便于后续的数据抓取。

日常用google chrome比较多,通过F12 Development Tool 分析页面请求过程。以爬tmall的用户评价为例,打开任何一个商品链接,在页面加载过程通过监控 network 刷出来的内容,通常一大堆的东西很难区分出哪个内容加载的评论数据,这里有个小技巧,点击下一页在页面加载下一页评论的过程中,在新加载的数据部分更容易发现目标。如下图,就是前两页评论的数据:

image

多刷几页会发现商品的评论数据链接地址格则比较简单,通过指定“currentPage=x”进行翻页,tmall的评论数据格式比较友好,json内的所有数据清晰可见,例如;itemId是商品id,sellerid是卖家id,currentPageNum是页面号,conten是商品评价内容 …

image

爬页面

爬页面主要是通过模拟页面请求将需要的web内容抓出来(主要是html数据),用到Python的urllib2 模块。urllib2 用一个request对象来映射web访问请求,通过urlopen函数将请求转成可操作的文件对象。

http请求

大部分用到的是http请求。

ftp 请求

主要是爬图片或其它文件用。

异常的处理,常见HTTP状态码:

"100" : Continue
"200" : OK
"403" : Forbidden
"404" : Not Found
"502" : Bad Gateway

Timeout 设置

爬的时候根据实际情况,注意合理设置timeout,避免网站响应太慢造成的影响

扣内容

类似ps的抠图一样,也需要从整个页面html文件中扣出所需的有效数据。扣内容主要用到re模块以及恰当的匹配规则。

re模块

使用re模块(re.findall ),的一般步骤是:

  1. 将正则表达式的字符串形式编译为Pattern实例
  2. 用Pattern实例处理文本并获得匹配结果(一个Match实例)
  3. 用Match实例获得信息,再进行其他的操作

规则匹配

  • 正则表达式,是做规则匹配的重要方法
  • CSS选择器是圈定范围的必备供手段。

页面验证

对于http请求,有些网站内容需要登录或者传cookie才能访问,注意正确的处理。

Cookie 的处理

需与cookielib模块配合,urllib2 对 cookie 处理是自动的。(urllib2.build_opener)

import cookielib 

cookie = cookielib.CookieJar() 

用户登录

urllib2.Request的时候加入data参数,将账户信息定义为字典通过data传入,POST给服务器。

反防盗链

通过设置Headers属性进行伪装,常用设置项:

headers = {
'User-Agent' : 'Mozilla/4.0',
'Referer':'http://www.xxxx.com/mall',
Content-Type : xxx,
application/json: xxx, }

数据存储

如果是图片等文件,直接存文件系统上;

像评论等文本内容,做格式化后存成csv文本文件或者json格式


++++++++++++++++++++++++++++++++++++++++++

爬虫框架Scrapy

对于大量数据爬取可以用爬虫框架,在数据格式化、数据保存等方面比urllib省事。大体过程差不多:

1、爬URL

通过定义Spiders实行对web内容的抓取,将html内容保存文本文件。

2、目标数据筛选

Scrapy里,可以使用XPath的selectors,基于 XPath表达式。Selectors 有四种基础的方法:

  • xpath():返回一系列的selectors,每一个select表示一个xpath参数表达式选择的节点
  • css():返回一系列的selectors,每一个select表示一个css参数表达式选择的节点
  • extract():返回一个unicode字符串,为选中的数据
  • re():返回一串一个unicode字符串,为使用正则表达式抓取出来的内容

获取文本:sel.xpath('//ul/li/text()').extract() 
获取超链接:sel.xpath(‘//ul/li/a/@href').extract()
结合css选择器:sites = sel.xpath('//ul[@class="main-post"]/li')

3、数据格式整理

对爬到的数据存放到Item对象中,方面后续做各种数据操作:

for site in sites:
   item = DmozItem()
   item['title'] = site.xpath('a/text()').extract()
   item['link'] = site.xpath('a/@href').extract()  
   item['desc'] = site.xpath('text()').extract() 
   items.append(item)  
return items

4、数据保存Pipeline

Feed exports,主要有四种:JSON,JSON lines,CSV,XML。

保存为json: scrapy crawl dmoz -o items.json -t json


++++++++++++++++++++++++++++++++++++++++++++++++++

其它

Pandas模块

Pandas也是常用的一个模块,主要两个用途:

1、用于数据整理,可以直接读取JSON,转成规范的DataFrame

2、作为数据分析工具

Selenium + Web Browser

Selenium模拟操作的方式爬web虽然效率比较低下,但不容易遭到封杀。有些不容易爬到又很重要的数据,可以试试 Selenium 。

Comments

Popular posts from this blog

Cloudera Hadoop 集群安装(ubuntu + CDH5.10)

前言 CDH是Cloudera公司的Hadoop发行版,基于稳定版本的Apache Hadoop构建,包含Hadoop,Spark,Hive,Hbase和一些工具等,并集成了很多补丁,可直接用于生产环境。通过Cloudera Manager可以简化hadoop各组件的部署和配置过程。 目前CDH对ubuntu支持的最高版本为14.04,因此不建议使用更高版本的ubuntu来部署CDH。 环境准备: 1.配置网络(所有节点) 修改hostname: $ sudo vi /etc/hostname cdh01 修改IP地址: $ sudo vi /etc/network/interfaces auto eth0 iface eth0 inet static         address 172.16.13.11         netmask 255.255.255.0         gateway 172.16.13.254 重启网络服务生效: $ sudo ifdown eth0 && sudo ifup eth0 修改ip与主机名的对应关系: $ sudo vi /etc/hosts 172.16.13.11 cdh01 172.16.13.12 cdh02 172.16.13.13 cdh03 2.配置SSH(所有节点) 启用root登陆(CDH5.10需要进行此步操作) $ sudo vi /etc/ssh/sshd_config #PermitRootLogin without-password PermitRootLogin yes $ sudo service ssh restart $ sudo passwd root 设置ssh无密码登陆 //在主节点上执行一路回车,生成无密码的密钥对 $ ssh-keygen -t rsa //将生成的密钥文件复制到其它节点 $ ssh-copy-id cdh02 $ ssh-copy-id cdh03 测试: 在主节点上ssh hadoop2,正常情况下,不需要密码就能直接登陆进去了。 3.安装Oracle JDK(所有节点) 运行CDH5必须使用Oracle的Jdk,需要Java 7及以上版本支持。 在Oracle的官网下载jdk包,解压到相应目录,例如/usr/java/jdk1.8.0_

Bitwarden 配置 Let’s Encrypt 证书

由于在内网环境部署的Bitwarden,不能通过安装脚本自动申请 Let’s Encrypt 的证书。 起初我用了一个自签名证书,发现特别不好使,虽然在firefox 跟 chrome 内核的浏览器上都能通过插件访问,但必须添加信任才行,特别是用Bitwarden Desktop 客户端连的时候,一直报错,可能是不认自签名证书。 于是琢磨了下怎么手动申请Let’s Encrypt的证书用于内网,对过程简单梳理如下。 自签名证书 | Self-Signed Certificate 如果你在内网环境只需要自签名证书,可以参考Bitwarden的帮助文档( Installing and depoying )进行设置: 1、生成自签名证书: //一条命创建私钥和证书: openssl req -x509 -newkey rsa:4096 -sha256 –nodes -days 10950 \    -keyout privite.key -out identity.crt \    -subj "/C= US /ST= New York /L= New York /O= Company Name /OU= CREAST /CN= bw.creast.win " 将生成的文件放到 /ssl 目录下: privite.key     ~/bwdata/ssl/ bw.creast.win/private.key identity.crt      ~/bwdata/ssl/ bw.creast.win/identity.crt 2、生成.pfx格式证书文件: //一条命令将前面生成的私钥和证书打包成需要的pfx格式文件 openssl pkcs12 -export -out ./ identity.pfx -inkey privite.key \    -in identity.crt -certfile identity.crt -passout pass: IDENTITY_CERT_PASSWORD 注意 IDENTITY_CERT_PASSWORD 跟./env/global.override.e

Tor洋葱路由的设置与使用

先说明一下,这里只是利用Tor来访问被GWF屏蔽的优秀服务(如Wikipedia、Blogger、GG App等),并不侧重于如何匿名访问网络。以下Tor设置方法适用于: MS Windows(2000/XP/Vista/Server)系统 第一步:下载并安装Tor 关于Tor(The Onion Router,洋葱路由)的工作原理,可以参考枪旗工作室的说明 ( http://tcno.net/doc/tor/#para1 )。在Windows下安装配置Tor已经非常容易了,直接下载这样一个Tor的Windows 捆绑软件包( Vidalia-Tor-Privoxy Bundle ),其中已经预先配置好这些软件能够一同工作。 安装前可以看到套件捆绑了哪些软件:Tor、Vidalia(Tor 的一个图形用户界面)和 Privoxy(Web 代理软件)、Torbutton(Firefox浏览器插件)全选这些软件进行安装。 安装完成后会自动运行Vidalia,在弹出的控制面板上可以看到当前的状态,Tor已经运行了,此时不需要再进行其它设置了。 第二步:配置浏览器使用Tor 如果使用 Firefox 浏览器,Bundle里已经附带了 Torbutton 插件 ,打开/重启Firefox就会在右下角显示Tor Enabled/Disabled,单击它可以选择是否开启Tor代理功能。 对于 Internet Explorer 没有现成的插件可用,需要手动配置代理设置,也很容易。 菜单位置 工具 - Internet 选项 - 连接 - 局域网设置 - 代理服务器 - 高级 - 服务器 在代理理服务器地址栏里填入 "localhost",端口为 "8118"(Privoxy不支持FTP代理,填不填都无所谓了);注意套接字SOCKS代理的端口为 "9050",如果有其它选项,请选择Socks5,然后"确定"即可。 对于 Maxthon ,如果对IE设置了Tor可以选择“使用IE代理设置”,或者手动添加一个代理列表,内容与上面填写的一样,然后选择应用就可以了。 这里说明一下 Privoxy 的作用,因为当直接使用 SOCKS 代理时,浏览器会泄露