【转】Python使用urllib2写爬虫抓站的一些技巧

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那就很显然了。 好的,有了要填写的数据,咱们就要生成postdatacookie

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' }

3.5 终极绝招

有时候即便作了3.1-3.4,访问仍是会被据,那么没办法,老老实实把httpfox中看到的headers全都写上,那通常也就好了。工具

再不行,那就只能用终极绝招了,selenium直接控制浏览器来进行访问,只要浏览器能够作到的,那么它也能够作到。相似的还有pamie,watir,等等等等。post

4.多线程并发抓取

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

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个线程等待队列 
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()
相关文章
相关标签/搜索