前段时间尝试用爬虫做个差评信息平台“MUSEE”,对折腾Python爬虫的一些过程记录下。
资源调研
资源调研主要是做对于要爬的线上数据进行调研,弄清楚站点的URL、数据链接、数据标签等,便于后续的数据抓取。
日常用google chrome比较多,通过F12 Development Tool 分析页面请求过程。以爬tmall的用户评价为例,打开任何一个商品链接,在页面加载过程通过监控 network 刷出来的内容,通常一大堆的东西很难区分出哪个内容加载的评论数据,这里有个小技巧,点击下一页在页面加载下一页评论的过程中,在新加载的数据部分更容易发现目标。如下图,就是前两页评论的数据:
多刷几页会发现商品的评论数据链接地址格则比较简单,通过指定“currentPage=x”进行翻页,tmall的评论数据格式比较友好,json内的所有数据清晰可见,例如;itemId是商品id,sellerid是卖家id,currentPageNum是页面号,conten是商品评价内容 …
爬页面
爬页面主要是通过模拟页面请求将需要的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 ),的一般步骤是:
- 将正则表达式的字符串形式编译为Pattern实例
- 用Pattern实例处理文本并获得匹配结果(一个Match实例)
- 用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
Post a Comment