python 爬虫抓站技巧

1、最基本的抓站

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

2、使用代理服务器

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

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

使用本机8087端口代理访问

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,那么就在opener加上proxy_support,改为:

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

3.2 表单的处理

对于一些需要登录的网页如何进行爬取呢?这里我们可以使用火狐的httpfox插件进行查看,这里登录网站进行查看表格

登录需要username/password/yzm等,我们接下来可以进行构造postdata

import urllib,urllib2
postdata = urllib.urlencode({
 'username':'xxxx',
 'password':'xxxx',
 'yzm':''
})
req = urllib2.Request(url = 'http://xxxxx',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://xxxx',
   data = postdata,
   headers = headers
 )

3.4 反“反盗链”

反盗链就是我们发送的请求中header里面,判断referer站点是不是来自该网址,那么我们就在headers添加该网址就ok咯

headers = {
  'Referer' = : 'http://xxxx'
  }

headers是一个dict数据结构,我们可以放入任何想要的header,来做一些伪装。

4、多线程抓取

线程和进程

进程:程序的一次执行,都有自己的地址空间、内存。数据栈以及其他记录其运动轨迹的辅助数据

线程:所有线程运行在同一个进程当中,共享相同的运行环境。线程有开始顺序执行和结束三个部分

一般,使用线程有两种模式,一种是创建线程要执行的函数,把这个函数传递进Thread对象里,让他来执行,另一种是直接从Thread继承,创建一个新的class,把线程执行的代码放到这个新的class里。

thread 提供基本的线程和锁定支持但是对于进程何时退出没有控制,当主线程结束时,所有其他线程也都强制结束,不会发出警告或者进行适当的处理

threading 提供更高几倍的功能更全的线程管理

Queue 可以创建一个队列数据结构,用于在多线程之间进行共享

thread模块中含函数和常量

import thread

thread.LockType   #锁对象的一种,用于线程的同步
thread.error      #线程的异常

thread.start_new_thread(function,args[,kwargs])

thread.exit()     #线程退出函数
thread.allocate_lock()   #生成一个未锁状态的锁对象

function:线程执行函数 args:线程执行函数的参数,类似tuple kwargs: 是一个字典,可选参数