详解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与shell的3种交互方式介绍
Apr 11 Python
Python3结合Dlib实现人脸识别和剪切
Jan 24 Python
pytorch中tensor的合并与截取方法
Jul 26 Python
python实现单链表中删除倒数第K个节点的方法
Sep 28 Python
一文了解Python并发编程的工程实现方法
May 31 Python
Python Web程序搭建简单的Web服务器
Jul 31 Python
python中时间转换datetime和pd.to_datetime详析
Aug 11 Python
使用python将excel数据导入数据库过程详解
Aug 27 Python
Python定义一个函数的方法
Jun 15 Python
Python+unittest+requests 接口自动化测试框架搭建教程
Oct 09 Python
python使用ctypes库调用DLL动态链接库
Oct 22 Python
Python实现中英文全文搜索的示例
Dec 04 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
全国FM电台频率大全 - 8 黑龙江省
2020/03/11 无线电
PHP令牌 Token改进版
2008/07/18 PHP
js和php邮箱地址验证的实现方法
2014/01/09 PHP
php中如何执行linux命令详解
2018/11/06 PHP
js给dropdownlist添加选项的小例子
2013/03/04 Javascript
jQuery写的日历(包括日历的样式及功能)
2013/04/23 Javascript
JQUERY dialog的用法详细解析
2013/12/19 Javascript
制作jquery遮罩层效果导航菜单代码分享
2013/12/25 Javascript
jQuery选择器querySelector的使用指南
2015/01/23 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
2016/12/02 Javascript
前端JS面试中常见的算法问题总结
2016/12/23 Javascript
BootStrapTable 单选及取值的实现方法
2017/01/10 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
2017/01/11 Javascript
bootstrap suggest下拉框使用详解
2017/04/10 Javascript
使用Math.max,Math.min获取数组中的最值实例
2017/04/25 Javascript
JavaScript数组的5种迭代方法
2017/09/29 Javascript
node文件批量重命名的方法示例
2017/10/23 Javascript
让Python代码更快运行的5种方法
2015/06/21 Python
Python 多核并行计算的示例代码
2017/11/07 Python
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
python爬虫超时的处理的实例
2018/12/19 Python
python自动发送测试报告邮件功能的实现
2019/01/22 Python
用Python实现BP神经网络(附代码)
2019/07/10 Python
pycharm 实现复制一行的快捷键
2021/01/15 Python
html5模拟平抛运动(模拟小球平抛运动过程)
2013/07/25 HTML / CSS
时尚孕妇装:HATCH Collection
2019/09/24 全球购物
巴西24小时在线药房:Drogasil
2020/06/20 全球购物
医学护理系毕业生求职信
2013/10/01 职场文书
服装设计师职业生涯规划范文
2014/02/28 职场文书
销售职业生涯规划范文
2014/03/14 职场文书
政府信息公开实施方案
2014/05/09 职场文书
个人学习党的群众路线教育实践活动心得体会
2014/11/05 职场文书
2015小学语文教师个人工作总结
2015/05/20 职场文书
纪检监察立案决定书
2015/06/24 职场文书
2015年大学组织委员个人工作总结
2015/10/23 职场文书
Python 可迭代对象 iterable的具体使用
2021/08/07 Python