一些常用的Python爬虫技巧汇总


Posted in Python onSeptember 28, 2016

Python爬虫:一些常用的爬虫技巧总结

爬虫在开发过程中也有很多复用的过程,这里总结一下,以后也能省些事情。

1、基本抓取网页

get方法

import urllib2
url "http://www.baidu.com"
respons = urllib2.urlopen(url)
print response.read()

post方法

import urllib
import urllib2

url = "http://abcde.com"
form = {'name':'abc','password':'1234'}
form_data = urllib.urlencode(form)
request = urllib2.Request(url,form_data)
response = urllib2.urlopen(request)
print response.read()

2、使用代理IP

在开发爬虫过程中经常会遇到IP被封掉的情况,这时就需要用到代理IP;

在urllib2包中有ProxyHandler类,通过此类可以设置代理访问网页,如下代码片段:

import urllib2

proxy = urllib2.ProxyHandler({'http': '127.0.0.1:8087'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
response = urllib2.urlopen('http://www.baidu.com')
print response.read()

3、Cookies处理

cookies是某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密),python提供了cookielib模块用于处理cookies,cookielib模块的主要作用是提供可存储cookie的对象,以便于与urllib2模块配合使用来访问Internet资源.

代码片段:

import urllib2, cookielib

cookie_support= urllib2.HTTPCookieProcessor(cookielib.CookieJar())
opener = urllib2.build_opener(cookie_support)
urllib2.install_opener(opener)
content = urllib2.urlopen('http://XXXX').read()

关键在于CookieJar(),它用于管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失,所有过程都不需要单独去操作。

手动添加cookie

cookie = "PHPSESSID=91rurfqm2329bopnosfu4fvmu7; kmsign=55d2c12c9b1e3; KMUID=b6Ejc1XSwPq9o756AxnBAg="

request.add_header("Cookie", cookie)

4、伪装成浏览器

某些网站反感爬虫的到访,于是对爬虫一律拒绝请求。所以用urllib2直接访问网站经常会出现HTTP Error 403: Forbidden的情况

对有些 header 要特别留意,Server 端会针对这些 header 做检查

1).User-Agent 有些 Server 或 Proxy 会检查该值,用来判断是否是浏览器发起的 Request
2).Content-Type 在使用 REST 接口时,Server 会检查该值,用来确定 HTTP Body 中的内容该怎样解析。

这时可以通过修改http包中的header来实现,代码片段如下:

import urllib2

headers = {
 'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
}
request = urllib2.Request(
 url = 'http://my.oschina.net/jhao104/blog?catalog=3463517',
 headers = headers
)
print urllib2.urlopen(request).read()

5、页面解析

对于页面解析最强大的当然是正则表达式,这个对于不同网站不同的使用者都不一样,就不用过多的说明,附两个比较好的网址:

正则表达式入门:https://3water.com/article/79618.htm

正则表达式在线测试:http://tool.oschina.net/regex/

其次就是解析库了,常用的有两个lxml和BeautifulSoup,对于这两个的使用介绍两个比较好的网站:

lxml:http://my.oschina.net/jhao104/blog/639448

BeautifulSoup:http://cuiqingcai.com/1319.html

对于这两个库,我的评价是,都是HTML/XML的处理库,Beautifulsoup纯python实现,效率低,但是功能实用,比如能用通过结果搜索获得某个HTML节点的源码;lxmlC语言编码,高效,支持Xpath

6、验证码的处理

对于一些简单的验证码,可以进行简单的识别。本人也只进行过一些简单的验证码识别。但是有些反人类的验证码,比如12306,可以通过打码平台进行人工打码,当然这是要付费的。

7、gzip压缩

有没有遇到过某些网页,不论怎么转码都是一团乱码。哈哈,那说明你还不知道许多web服务具有发送压缩数据的能力,这可以将网络线路上传输的大量数据消减 60% 以上。这尤其适用于 XML web 服务,因为 XML 数据 的压缩率可以很高。

但是一般服务器不会为你发送压缩数据,除非你告诉服务器你可以处理压缩数据。

于是需要这样修改代码:

import urllib2, httplib
request = urllib2.Request('http://xxxx.com')
request.add_header('Accept-encoding', 'gzip') 1
opener = urllib2.build_opener()
f = opener.open(request)

这是关键:创建Request对象,添加一个 Accept-encoding 头信息告诉服务器你能接受 gzip 压缩数据

然后就是解压缩数据:

import StringIO
import gzip

compresseddata = f.read() 
compressedstream = StringIO.StringIO(compresseddata)
gzipper = gzip.GzipFile(fileobj=compressedstream) 
print gzipper.read()

8、多线程并发抓取

单线程太慢的话,就需要多线程了,这里给个简单的线程池模板 这个程序只是简单地打印了1-10,但是可以看出是并发的。

虽然说python的多线程很鸡肋,但是对于爬虫这种网络频繁型,还是能一定程度提高效率的。

from threading import Thread
from Queue import Queue
from time import sleep
# q是任务队列
#NUM是并发线程总数
#JOBS是有多少任务
q = Queue()
NUM = 2
JOBS = 10
#具体的处理函数,负责处理单个任务
def do_somthing_using(arguments):
 print arguments
#这个是工作进程,负责不断从队列取数据并处理
def working():
 while True:
 arguments = q.get()
 do_somthing_using(arguments)
 sleep(1)
 q.task_done()
#fork NUM个线程等待

 alert(“Hello CSDN”);
for i in range(NUM):
 t = Thread(target=working)
 t.setDaemon(True)
 t.start()
#把JOBS排入队列
for i in range(JOBS):
 q.put(i)
#等待所有JOBS完成
q.join()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python正则表达式去掉数字中的逗号(python正则匹配逗号)
Dec 25 Python
python连接mysql调用存储过程示例
Mar 05 Python
Python实现的数据结构与算法之快速排序详解
Apr 22 Python
Python根据区号生成手机号码的方法
Jul 08 Python
python 专题九 Mysql数据库编程基础知识
Mar 16 Python
使用Python3制作TCP端口扫描器
Apr 17 Python
django 通过URL访问上传的文件方法
Jul 28 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
Aug 21 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
Aug 28 Python
Python Web静态服务器非堵塞模式实现方法示例
Nov 21 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
Feb 20 Python
python编写五子棋游戏
May 25 Python
Python三级目录展示的实现方法
Sep 28 #Python
Python黑帽编程 3.4 跨越VLAN详解
Sep 28 #Python
python 采集中文乱码问题的完美解决方法
Sep 27 #Python
20招让你的Python飞起来!
Sep 27 #Python
python搭建虚拟环境的步骤详解
Sep 27 #Python
利用python发送和接收邮件
Sep 27 #Python
实现python版本的按任意键继续/退出
Sep 26 #Python
You might like
PHPUnit PHP测试框架安装方法
2011/03/23 PHP
php模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
浅谈php函数serialize()与unserialize()的使用方法
2014/08/19 PHP
PHP获取网页所有连接的方法(附demo源码下载)
2016/03/30 PHP
PHP中Trait及其应用详解
2017/02/14 PHP
javascript操作html控件实例(javascript添加html)
2013/12/02 Javascript
提交按钮的name='submit'引起的js失效问题及原因
2015/02/25 Javascript
$.extend 的一个小问题
2015/06/18 Javascript
第十章之巨幕页头缩略图与警告框组件
2016/04/25 Javascript
javascript对象的相关操作小结
2016/05/16 Javascript
不使用script导入js文件的几种方法
2016/10/27 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
2017/03/03 Javascript
Angular搜索 过滤 批量删除 添加 表单验证功能集锦(实例代码)
2017/10/25 Javascript
mpvue中配置vuex并持久化到本地Storage图文教程解析
2018/03/15 Javascript
微信用户访问小程序的登录过程详解
2019/09/20 Javascript
JavaScript实现像雪花一样的Hexaflake分形
2020/07/07 Javascript
[02:42]决战东方!DOTA2亚洲邀请赛重启荣耀之争
2017/03/17 DOTA
Python+django实现文件下载
2016/01/17 Python
python 回调函数和回调方法的实现分析
2016/03/23 Python
Python2和Python3中print的用法示例总结
2017/10/25 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
TensorFlow模型保存/载入的两种方法
2018/03/08 Python
Python+request+unittest实现接口测试框架集成实例
2018/03/16 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
基于python图像处理API的使用示例
2020/04/03 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
python函数超时自动退出的实操方法
2020/12/28 Python
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
雷曼兄弟的五金店:Lehman’s Hardware Store
2019/04/10 全球购物
如何用Python输出一个Fibonacci数列
2016/08/28 面试题
升职自荐信范文
2013/10/05 职场文书
大学生校园创业计划书
2014/02/08 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP