【python爬虫专项(30)】链家二手房源数据采集3(大数据量下的动态ip设置)

反爬措施

之前使用等待时间来进行反爬措施的应对,也可以通过设置动态ip代理来应对

  1. 为什么爬虫需要设置代理ip?
    当一直使用同一个ip访问网站时,由于访问网站次数过量,给服务器过多压力,该ip可能被禁
    IP地址:IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异

  2. 如何查看本地ip地址
    ① 直接百度搜索“ip”
    在这里插入图片描述
    ② 通过访问网站返回信息得到:本机ip查询
    可以直接点击链接,也可以在代码窗口通过输入代码获取
    在这里插入图片描述

  3. 什么是代理ip?
    代理,也称网络代理,英文全称是(Proxy Server),是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接

    完整的代理请求过程
    客户端首先与代理服务器创建连接,接着根据代理服务器所使用的代理协议,请求对目标服务器创建连接、或者获得目标服务器的指定资源;网络用户可以通过代理访问国外网站

  4. 如何选择使用代理
    免费代理
             不建议使用
    付费代理
             以阿布云为例
    ①注册阿布云
    ② 建议购买版本:HTTP隧道列表(动态版)
    每条隧道的任意请求都从一个随机IP发出,默认每秒 5 个请求数,最多允许每秒 200 个请求数
    在这里插入图片描述
    ③ python中如何设置?
    在这里插入图片描述

import requests
ipurl = 'http://icanhazip.com/'
proxyHost = 'http-dyn.abuyun.com'
proxyPort = '9020'

proxyUser = 'HUBS6OW9L1YK7T4D'
proxyPass = '282C060B59B6BD58'

proxyMeta = 'http://%(user)s:%(pass)s@%(host)s:%(port)s' %{
        'host':proxyHost,
        'port':proxyPort,
        'user':proxyUser,
        'pass':proxyPass
        }

ips = {
        'http':proxyMeta,
        'https':proxyMeta
        }
        
for i in range(1,10):
    resp = requests.get(ipurl,proxies=ips)
    print('第{}次请求的ip为:{}'.format(i, resp.text))

输出结果如下:(之前已经导入过requests库了)
在这里插入图片描述

完善上一篇博文中反爬的对策

定义第三个函数,来生成动态的ip,代码如下

def get_proxies(p_User,p_Pass,p_Host,p_Port):
    ''' 【生成动态代理ip】函数
    p_Host、p_Port:设置代理服务器
    p_User、p_Pass:设置代理隧道验证信息
    '''
    p = 'http://%(user)s:%(pass)s@%(host)s:%(port)s' %{
            'host':p_Host,
            'port':p_Port,
            'user':p_User,
            'pass':p_Pass
            }
    ips = {
            'http':p,
            'https':p
            }
    return ips

#检测是否可以运行
ips_dic = get_proxies('HUBS6OW9L1YK7T4D','282C060B59B6BD58','http-dyn.abuyun.com','9020')     
for i in range(1,10):
    resp = requests.get('http://icanhazip.com/',proxies=ips_dic)
    print('第{}次请求的ip为:{}'.format(i, resp.text))

在这里插入图片描述

在第二个函数中设置动态ip

需要在get请求后的括号里面添加proxies = ips的参数

r = requests.get(ui,headers = d_h, cookies = d_c,proxies = ips)

再调用封装的第三个函数

ips_dic = get_proxies('HUBS6OW9L1YK7T4D','282C060B59B6BD58','http-dyn.abuyun.com','9020')

爬取链家二手房源的全部代码及输出结果

全部代码(由于设置了动态ip,所以这里的等待时间就不需要了)

import re
import requests
from bs4 import BeautifulSoup
import pymongo


def url_extract(database,table,field): 
    '''【数据网页url提取】函数
    database:数据库
    table:源数据mongo集合对象
    field:url字段
    '''
    dlst = table.find()
    lst = []
    for item in dlst:
        lst.append(item[field])
    return lst



def get_proxies(p_User,p_Pass,p_Host,p_Port):
    ''' 【生成动态代理ip】函数
    p_Host、p_Port:设置代理服务器
    p_User、p_Pass:设置代理隧道验证信息
    '''
    p = 'http://%(user)s:%(pass)s@%(host)s:%(port)s' %{
            'host':p_Host,
            'port':p_Port,
            'user':p_User,
            'pass':p_Pass
            }
    ips = {
            'http':p,
            'https':p
            }
    return ips

def get_data(ui,d_h,d_c,ips,table):
    ''' 【数据采集及mongo入库】函数
    ui:数据信息网页
    d_h:user-agent信息
    ips:代理设置
    table:mongo集合对象
    '''
    r = requests.get(ui,headers = d_h, cookies = d_c,proxies = ips)
    soup = BeautifulSoup(r.text, 'lxml')
    dic = {}
    dic['标题'] = soup.h1.text
    price = soup.find('div', class_="price").text
    dic['总价_万'] = re.search(r'(\d+)万', price).group(1)
    dic['单价_元'] = re.search(r'(\d+)元', price).group(1)
    
    base_info = soup.find('div', class_="base").find('ul').find_all('li')
    for li in base_info:
        st = re.split(r'<.*?>',str(li))
        dic[st[2]] = st[3]
        
    transaction_info = soup.find('div', class_="transaction").find('ul').find_all('li')
    for li in transaction_info:
        st = re.split(r'<.*?>',str(li))
        dic[st[2]] = st[4].replace('\n','').replace(' ','')
        
    loc = re.search(r"resblockPosition:'([\d.]+),([\d.]+)'",r.text)
    dic['lng'] = loc.group(1)
    dic['lat'] = loc.group(2)
    table.insert_one(dic)




if __name__ == '__main__':
    
    dic_headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
    
    cookies = "TY_SESSION_ID=a63a5c48-ee8a-411b-b774-82b887a09de9; lianjia_uuid=1e4ed8ae-d689-4d12-a788-2e93397646fd; _smt_uid=5dbcff46.49fdcd46; UM_distinctid=16e2a452be0688-0c84653ae31a8-e343166-1fa400-16e2a452be1b5b; _jzqy=1.1572667207.1572667207.1.jzqsr=baidu|jzqct=%E9%93%BE%E5%AE%B6.-; _ga=GA1.2.1275958388.1572667209; _jzqx=1.1572671272.1572671272.1.jzqsr=sh%2Elianjia%2Ecom|jzqct=/ershoufang/pg2l1/.-; select_city=310000; lianjia_ssid=a2a11c0a-c451-43aa-879e-0d202a663a5d; Hm_lvt_9152f8221cb6243a53c83b956842be8a=1582085114; CNZZDATA1253492439=1147125909-1572665418-https%253A%252F%252Fsp0.baidu.com%252F%7C1582080390; CNZZDATA1254525948=626340744-1572665293-https%253A%252F%252Fsp0.baidu.com%252F%7C1582083769; CNZZDATA1255633284=176672440-1572665274-https%253A%252F%252Fsp0.baidu.com%252F%7C1582083985; CNZZDATA1255604082=1717363940-1572665282-https%253A%252F%252Fsp0.baidu.com%252F%7C1582083899; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2216e2a452d07c03-0d376ce6817042-e343166-2073600-16e2a452d08ab2%22%2C%22%24device_id%22%3A%2216e2a452d07c03-0d376ce6817042-e343166-2073600-16e2a452d08ab2%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_referrer_host%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_utm_source%22%3A%22baidu%22%2C%22%24latest_utm_medium%22%3A%22pinzhuan%22%2C%22%24latest_utm_campaign%22%3A%22sousuo%22%2C%22%24latest_utm_content%22%3A%22biaotimiaoshu%22%2C%22%24latest_utm_term%22%3A%22biaoti%22%7D%7D; _qzjc=1; _jzqa=1.941285633448461200.1572667207.1572671272.1582085116.3; _jzqc=1; _jzqckmp=1; _gid=GA1.2.1854019821.1582085121; Hm_lpvt_9152f8221cb6243a53c83b956842be8a=1582085295; _qzja=1.476033730.1572667206855.1572671272043.1582085116087.1582085134003.1582085295034.0.0.0.14.3; _qzjb=1.1582085116087.4.0.0.0; _qzjto=4.1.0; _jzqb=1.4.10.1582085116.1"
    dic_cookies = {}
    for i in cookies.split('; '):
        dic_cookies[i.split("=")[0]] = i.split("=")[1]
        
    myclient = pymongo.MongoClient("mongodb://localhost:27017/")
    db = myclient['链家二手房_1']
    datatable = db['data_1']
    


    datatable2 = db['data_2']
    datatable2.delete_many({})
    
    urllst = url_extract(db,datatable,'链接')[:500]
    ips_dic = get_proxies('HUBS6OW9L1YK7T4D','282C060B59B6BD58','http-dyn.abuyun.com','9020')     
    
    errorlst = []
    count = 1
    for u in urllst:
        #print("程序正在休息......")
        #time.sleep(3)
        try:
            get_data(u,dic_headers,dic_cookies,ips_dic, datatable2)
            print(f'成功采集{count}条数据')
            count += 1
        except:
            errorlst.append(u)
            print('数据采集失败,网址为:',u)

输出结果为:(这里获取的网页url的多少取决最初存放到数据库中链接的个数,虽然我索引的是500条数据,但是在之前爬取的url只有300条,所以这里去掉一些无法获取的,最终获得了266条数据)
在这里插入图片描述
数据库的数据如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lys_828

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值