详解Python爬虫的基本写法


Posted in Python onJanuary 08, 2016

什么是爬虫

爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来。想抓取什么?这个由你来控制它咯。

比如它在抓取一个网页,在这个网中他发现了一条道路,其实就是指向网页的超链接,那么它就可以爬到另一张网上来获取数据。这样,整个连在一起的大网对这之蜘蛛来说触手可及,分分钟爬下来不是事儿。

1.最基本的抓站

import urllib2
content = urllib2.urlopen('http://XXXX').read()

2.使用代理服务器

这在某些情况下比较有用,比如IP被封了,或者比如IP访问的次数受到限制等等。

import urllib2
proxy_support = urllib2.ProxyHandler({'http':'http://XX.XX.XX.XX:XXXX'})
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)
content = urllib2.urlopen('http://XXXX').read()

3.需要登录的情况

登录的情况比较麻烦我把问题拆分一下:

3.1.cookie的处理

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

是的没错,如果想同时用代理和cookie,那就加入proxy_support然后operner改为

opener = urllib2.build_opener(proxy_support, cookie_support, urllib2.HTTPHandler)

3.2 表单的处理

登录必要填表,表单怎么填?首先利用工具截取所要填表的内容
比如我一般用firefox+httpfox插件来看看自己到底发送了些什么包
这个我就举个例子好了,以verycd为例,先找到自己发的POST请求,以及POST表单项:

可以看到verycd的话需要填username,password,continueURI,fk,login_submit这几项,其中fk是随机生成的(其实不太随机,看上去像是把epoch时间经过简单的编码生成的),需要从网页获取,也就是说得先访问一次网页,用正则表达式等工具截取返回数据中的fk项。continueURI顾名思义可以随便写,login_submit是固定的,这从源码可以看出。还有username,password那就很显然了。

好的,有了要填写的数据,我们就要生成postdata

import urllib
postdata=urllib.urlencode({
'username':'XXXXX',
'password':'XXXXX',
'continueURI':'http://www.verycd.com/',
'fk':fk,
'login_submit':'登录'
})

然后生成http请求,再发送请求:

req = urllib2.Request(
url = 'http://secure.verycd.com/signin/*/http://www.verycd.com/',
data = postdata
)
result = urllib2.urlopen(req).read()

3.3 伪装成浏览器访问

某些网站反感爬虫的到访,于是对爬虫一律拒绝请求

这时候我们需要伪装成浏览器,这可以通过修改http包中的header来实现

#…
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'
}
req = urllib2.Request(
url = 'http://secure.verycd.com/signin/*/http://www.verycd.com/',
data = postdata,
headers = headers
)
#...

3.4 反”反盗链”

某些站点有所谓的反盗链设置,其实说穿了很简单,就是检查你发送请求的header里面,referer站点是不是他自己,所以我们只需要像3.3一样,把headers的referer改成该网站即可,以黑幕著称地cnbeta为例:

#...
headers = {
'Referer':'http://www.cnbeta.com/articles'
}
#...

headers是一个dict数据结构,你可以放入任何想要的header,来做一些伪装。例如,有些自作聪明的网站总喜欢窥人隐私,别人通过代理访问,他偏偏要读取header中的X-Forwarded-For来看看人家的真实IP,没话说,那就直接把X-Forwarde-For改了吧,可以改成随便什么好玩的东东来欺负欺负他,呵呵。

3.5 终极绝招

有时候即使做了3.1-3.4,访问还是会被据,那么没办法,老老实实把httpfox中看到的headers全都写上,那一般也就行了。
再不行,那就只能用终极绝招了,selenium直接控制浏览器来进行访问,只要浏览器可以做到的,那么它也可以做到。类似的还有pamie,watir,等等等等。

4.多线程并发抓取

print time.time()-start
1..
from threading import Thread
from Queue import Queue
from time import sleep
import urllib2
import time
q = Queue()
NUM = 10
JOBS = 50
def do_somthing_using(p):
response = urllib2.urlopen('http://www.cnblogs.com')
result = response.read()
#print p
def working():
while True:
arguments = q.get()
do_somthing_using(arguments)
q.task_done()
for i in xrange(NUM):
t = Thread(target=working)
t.setDaemon(True)
t.start()
start = time.time()
for i in xrange(JOBS):
q.put(i)
q.join()
print "MultiThreading:"
print time.time()-start
2..
from threading import Thread
from multiprocessing.dummy import Pool as ThreadPool
import urllib2
import time
start = time.time()
url = "http://www.cnblogs.com"
urls = [url] * 50
pool = ThreadPool(4)
results = pool.map(urllib2.urlopen, urls)
pool.close()
pool.join()
print "Map:"
print time.time()-start

关于Python爬虫的基本写法小编就给大家介绍到这里,后续还会持续更细,敬请关注,谢谢!

Python 相关文章推荐
使用python遍历指定城市的一周气温
Mar 31 Python
Python3之文件读写操作的实例讲解
Jan 23 Python
Python给定一个句子倒序输出单词以及字母的方法
Dec 20 Python
python通过配置文件共享全局变量的实例
Jan 11 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
Sep 24 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
Apr 10 Python
python 实现任务管理清单案例
Apr 25 Python
Python实现转换图片背景颜色代码
Apr 30 Python
Django DRF APIView源码运行流程详解
Aug 17 Python
python 视频下载神器(you-get)的具体使用
Jan 06 Python
聊聊Python中关于a=[[]]*3的反思
Jun 02 Python
如何使用Python提取Chrome浏览器保存的密码
Jun 09 Python
黑科技 Python脚本帮你找出微信上删除你好友的人
Jan 07 #Python
星球大战与Python之间的那些事
Jan 07 #Python
python高手之路python处理excel文件(方法汇总)
Jan 07 #Python
Python解析最简单的验证码
Jan 07 #Python
Python中http请求方法库汇总
Jan 06 #Python
python访问mysql数据库的实现方法(2则示例)
Jan 06 #Python
分享Python文本生成二维码实例
Jan 06 #Python
You might like
php实现遍历目录并删除指定文件中指定内容
2015/01/21 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
2017/04/18 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
laravel-admin 实现给grid的列添加行数序号的方法
2019/10/08 PHP
php中使用array_filter()函数过滤数组实例讲解
2021/03/03 PHP
查看图片(前进后退)功能实现js代码
2013/04/24 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
JavaScript模拟实现键盘打字效果
2015/06/29 Javascript
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
2016/04/16 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【二】
2016/05/10 Javascript
js验证框架之RealyEasy验证详解
2016/06/08 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
2016/08/23 Javascript
jQuery Ztree行政地区树状展示(点击加载)
2016/11/09 Javascript
原生js实现焦点轮播图效果
2017/01/12 Javascript
JS之if语句对接事件动作逻辑(详解)
2017/06/28 Javascript
Vue.js项目模板搭建图文教程
2017/09/20 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
vue实现带过渡效果的下拉菜单功能
2020/02/19 Javascript
vue 手机物理监听键+退出提示代码
2020/09/09 Javascript
Python中文编码那些事
2014/06/25 Python
Python最基本的输入输出详解
2015/04/25 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
如何使用python3获取当前路径及os.path.dirname的使用
2019/12/13 Python
使用CSS3和Checkbox实现JQuery的一些效果
2015/08/03 HTML / CSS
美国新蛋IT数码商城:Newegg.com
2016/07/21 全球购物
物业管理求职自荐信
2013/09/25 职场文书
关于幼儿的自我评价
2013/12/18 职场文书
公司保密承诺书
2014/03/27 职场文书
求职信格式要求
2014/05/23 职场文书
2014年扫黄打非工作总结
2014/12/03 职场文书
行政复议决定书
2015/06/24 职场文书
运动会通讯稿50字
2015/07/20 职场文书
开业典礼致辞
2015/07/29 职场文书
JavaScript严格模式不支持八进制的问题讲解
2021/11/07 Javascript
python数据可视化JupyterLab实用扩展程序Mito
2021/11/20 Python
二维码条形码生成的JavaScript脚本库
2022/07/07 Javascript