注册
登录
提问时间:2018/6/28 16:11:43    楼主:未知网友   阅读量:368

用python做爬虫可以说是非常常见的,很多人都选择这门语言来做爬虫,因为它简洁。这里整理了一些python爬虫的相关技巧,希望对初学者有所帮助。


一、最基本的操作

抓取某个站点。


import urllib2

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


二、使用代理IP

最头疼的事情莫过于封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()


三、cookie的处理

登陆的时候不得不面对cookie,cookie不处理好,很可能被目标服务器发现爬虫行为,进而做出限制。


import urllib2, cookielib

cookie_support= urllib2.HTTPCookieProcessor(cookielib.CookieJar())

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

urllib2.install_opener(opener)

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


四、User-Agent的处理

爬虫行为很令人反感,恨不得杀之后快,但如果伪装成浏览器访问时,目标服务器就视而不见了。如何伪装呢,这就要通过修改HTTP包中的Header的User-Agent来实现了。


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://***.****.***/***/****',

    data = postdata,

    headers = headers

)

当然,更好的办法是搜集很多浏览器的User-Agent,然后随机使用。


五、多线程抓取信息


不会多线程抓取的爬虫不是好爬虫,由于顾忌到反爬策略,尽量模拟人工访问,速度自然不可能太快,所以只能多线程来抓取了。


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()


关于python的爬虫技巧就总结到这里了,还有很多小技巧这里就不一一说明,期待各位一一整理,祝大家工作愉快,爬虫需要代理IP可以联系站大爷。