| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
爬虫入门基础-Python 
爬取数据 
这一步,你要明确要得到的内容是什么?是HTML源码,还是Json格式的字符串等。 
1. 最基本的爬取 
抓取大多数情况属于get请求,即直接从对方服务器上获取数据。 
首先,Python中自带urllib及urllib2这两个模块,基本上能满足一般的页面抓取。另外,requests也是非常有用的包,与此类似的,还有httplib2等等。 
import requests 
url = http://current.ip.16yun.cn:802 
response = requests.get(url) 
content = requests.get(url).content 
print("response headers:", response.headers) 
print("content:", content) 
此外,对于带有查询字段的url,get请求一般会将来请求的数据附在url之后,以?分割url和传输数据,多个参数用&连接。 
import requests 
data = {'wd':'nike', 'ie':'utf-8'} 
url='https://www.baidu.com' 
response = requests.get(url=url, params=data) 
2. 对于登陆情况的处理 
2.1 使用表单登陆 
这种情况属于post请求,即先向服务器发送表单数据,服务器再将返回的cookie存入本地。 
import requests 
data = {'data1':'XXXXX', 'data2':'XXXXX'} 
response = requests.post(url=url, data=data) 
2.2 使用cookie登陆 
使用cookie登陆,服务器会认为你是一个已登陆的用户,所以就会返回给你一个已登陆的内容。因此,需要验证码的情况可以使用带验证码登陆的cookie解决。 
    #! -*- encoding:utf-8 -*- 
    import requests 
    import random 
    import requests.adapters 
    # 要访问的目标页面 
    targetUrlList = [ 
        "https://httpbin.org/ip", 
        "https://httpbin.org/headers", 
        "https://httpbin.org/user-agent", 
    ] 
    # 代理服务器(产品官网 www.16yun.cn) 
    proxyHost = "t.16yun.cn" 
    proxyPort = "31111" 
    # 代理隧道验证信息 
    proxyUser = "username" 
    proxyPass = "password" 
    proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % { 
        "host": proxyHost, 
        "port": proxyPort, 
        "user": proxyUser, 
        "pass": proxyPass, 
    } 
    # 设置 http和https访问都是用HTTP代理 
    proxies = { 
        "http": proxyMeta, 
        "https": proxyMeta, 
    } 
    # 访问三次网站,使用相同的Session(keep-alive),均能够保持相同的外网IP 
    s = requests.session() 
    # 设置cookie 
    cookie_dict = {"JSESSION":"123456789"} 
    cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True) 
    s.cookies = cookies 
    for i in range(3): 
        for url in targetUrlList: 
            r = s.get(url, proxies=proxies) 
            print r.text 
若存在验证码,此时采用response = requests_session.post(url=url_login, data=data)是不行的,做法应该如下: 
response_captcha = requests_session.get(url=url_login, cookies=cookies) 
response1 = requests.get(url_login) # 未登陆 
response2 = requests_session.get(url_login) # 已登陆,因为之前拿到了Response Cookie! 
response3 = requests_session.get(url_results) # 已登陆,因为之前拿到了Response Cookie! 
3. 对于反爬虫机制的处理 
3.1 使用代理 
适用情况:大部分网站均限制了IP的访问量 
对于“频繁点击”的情况,我们还可以通过限制爬虫访问网站的频率来避免被网站禁掉。 
        #! -*- encoding:utf-8 -*- 
        import requests 
        import random 
        # 要访问的目标页面 
        targetUrl = "http://httpbin.org/ip" 
        # 要访问的目标HTTPS页面 
        # targetUrl = "https://httpbin.org/ip" 
        # 代理服务器(产品官网 www.16yun.cn) 
        proxyHost = "t.16yun.cn" 
        proxyPort = "31111" 
        # 代理隧道验证信息 
        proxyUser = "username" 
        proxyPass = "password" 
        proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % { 
            "host" : proxyHost, 
            "port" : proxyPort, 
            "user" : proxyUser, 
            "pass" : proxyPass, 
        } 
        # 设置 http和https访问都是用HTTP代理 
        proxies = { 
            "http"  : proxyMeta, 
            "https" : proxyMeta, 
        } 
        #  设置IP切换头 
        tunnel = random.randint(1,10000) 
        headers = {"Proxy-Tunnel": str(tunnel)} 
        resp = requests.get(targetUrl, proxies=proxies, headers=headers) 
        print resp.status_code 
        print resp.text 
3.2 时间设置 
适用情况:限制频率情况。大部分网站有频率限制,比如搜索后需要一定间隔才能获取详情页面等。 
我们可以用sleep方式来做出以下延迟。 
import time 
time.sleep(1) 
3.3 伪装成浏览器,或者反“反盗链” 
有些网站会检查你是不是真的浏览器访问,还是机器自动访问的。这种情况,加上User-Agent,表明你是浏览器访问即可。有时还会检查是否带Referer信息还会检查你的Referer是否合法,一般再加上Referer。 
User-Agent可以用亿牛云提供给的真实库,Referer的来源可以伪装成百度搜索来的。 
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.1276.73 Safari/537.36', 'Referer':'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=nike'} 
response = requests.get(url=url, headers=headers) 
4. 对于Ajax请求的处理 
对于“加载更多”情况,使用Ajax来传输很多数据。 
它的工作原理是:从网页的url加载网页的源代码之后,会在浏览器里执行JavaScript程序。这些程序会加载更多的内容,“填充”到网页里。这就是为什么如果你直接去爬网页本身的url,你会找不到页面的实际内容。 
这里,若使用Google Chrome分析”请求“对应的链接(方法:右键→审查元素→Network→清空,点击”加载更多“,出现对应的GET链接寻找Type为text/html的,点击,查看get参数或者复制Request URL),循环过程。 
• 如果“请求”之前有页面,依据上一步的网址进行分析推导第1页。以此类推,抓取抓Ajax地址的数据。 
• 对返回的json格式数据(str)进行正则匹配。json格式数据中,需从'\uxxxx'形式的unicode_escape编码转换成u'\uxxxx'的unicode编码。 
爬取有两个需要注意的问题: 
• 如何处理js生成的cookie 
• 如何控制频率和利用代理破除反爬限制 |   
 
 
 
 |