app开发定制公司写Python爬虫又被屏蔽了,你现在需要一个稳定的代理IP

📢📢📢📢📢📢
💗 app开发定制公司你正在阅读 【app开发定制公司梦想橡皮擦】 的博客
👍 阅读完毕,app开发定制公司可以点点小手赞一下
🌻 发现错误,app开发定制公司直接评论区中指正吧
📆 app开发定制公司橡皮擦的第 698 app开发定制公司篇原创博客

app开发定制公司从订购之日起,案例 5 app开发定制公司年内保证更新

文章目录

⛳️ app开发定制公司头铁的工程师

app开发定制公司如果一个爬虫工程师,app开发定制公司手里拿不出来一些可用代理 IP,多少有些说不出去,毕竟我们每天面对各种反爬场景,没有代理,工作还真不好展开,因此橡皮擦每周都有一个“小任务”,找一个稳定的代理源。

今天在畅游互联网,找代理 IP 的时候,发现了一个新代理站点,那必须试一把,而且这个站点认证就送流量,站点名字叫做 IPIDEA,是一个专门做海外代理的站点。

注册之后,立刻就有客服人员电话送流量了,这服务没得说。

下面你可以一边注册,一边学习下面的一些概念,该知识点和中级爬虫工程师息息相关!如果你还在学习阶段,本篇博客就可以让你提前接触中级的知识点啦。

⛳️ 什么是住宅代理 IP

住宅 IP 地址是与物理设备绑定的 IP 地址,与动态 IP 不同,服务器会将住宅 IP 识别为真实的人,安全性和稳定性更高,也由于该原因,我们可以将自己的位置变为世界各个国家地区的家庭地址,从而实现从指定位置访问目标站点,避免地理限制。

如果你用了住宅代理 IP,玩游戏都能解除锁区限制。

为什么要用住宅代理
必然是因为某些原因,你想要隐藏 IP 地址,作为一个爬虫工程师,你一定会用到,例如网络抓取,广告验证,网络营销……,如果你正在学习 Python 爬虫,对住宅代理 IP 的使用场景不熟悉,正好也可以去该代理 IP 站点 (地址在评论区)学习一下,提供解决方案的产品站点上,一定有市场上最需要的技术。

⛳️ 代理实战

目标站点已经有了,下面就需要去采集代理数据了,毕竟作为程序员不能每次都手动获取 IP,打开菜单栏中的【代理服务】,结果直接发现 API Demo,好家伙,真便利。

实战中橡皮擦测试了多种代理类型,例如 API 链接形式、账密认证形式、IP 端口形式。而且作为一款代理平台,ipidea 支持的协议类型有,http/https/socks5,满足了常用场景的实战需求。


点击 API 获取之后(需要实名注册一下),获取 API 链接

复制上述地址,填写到下文图片后的代码中,即可实现代理 IP 提取器。

测试代码如下所示:

# coding=utf-8# !/usr/bin/env pythonimport jsonimport threadingimport timeimport requests as rqheaders = {    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0",    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",    "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",    "Accept-Encoding": "gzip, deflate, br"}testUrl = 'https://api.myip.la/en?json'# 核心业务def testPost(host, port):    proxies = {        'http': 'http://{}:{}'.format(host, port),        'https': 'http://{}:{}'.format(host, port),    }    res = ""    while True:        try:            res = rq.get(testUrl, proxies=proxies, timeout=5)            # print(res.status_code)            print(res.status_code, "***", res.text)            break        except Exception as e:            print(e)            break    returnclass ThreadFactory(threading.Thread):    def __init__(self, host, port):        threading.Thread.__init__(self)        self.host = host        self.port = port    def run(self):        testPost(self.host, self.port)    # 提取代理的链接  json类型的返回值tiqu = 'http://api.proxy.ipidea.io/getProxyIp...刚刚复制的地址'while 1 == 1:    # 每次提取10个,放入线程中    resp = rq.get(url=tiqu, timeout=5)    try:        if resp.status_code == 200:            dataBean = json.loads(resp.text)        else:            print("获取失败")            time.sleep(1)            continue    except ValueError:        print("获取失败")        time.sleep(1)        continue    else:        # 解析json数组        print("code=", dataBean["code"])        code = dataBean["code"]        if code == 0:            threads = []            for proxy in dataBean["data"]:                threads.append(ThreadFactory(proxy["ip"], proxy["port"]))            for t in threads:  # 开启线程                t.start()                time.sleep(0.01)            for t in threads:  # 阻塞线程                t.join()                # break    time.sleep(1)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81

实战中,可以每次获取一个 IP,只需要按照 API 参数说明,修改请求地址即可。


运行代码,得到下述输出,这里需要看你向接口传递的数据返回类型。

{"code":0,"success":true,"msg":"请求成功","request_ip":"124.236.251.177","data":[{"ip":"3.64.130.48","port":17704}]}
  • 1

⛳️ Python 使用代理

在获取了代理 IP 之后,就可以配合 requests 模块完成代理请求操作。
测试代码如下所示:

import requestsimport jsonurl = 'https://httpbin.org/get'headers = {    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0",}api_url = 'http://api.proxy.ipidea.io/getProxyIp?num=1&return_type=json&lb=1&sb=0&flow=1®ions=&protocol=http'res = requests.post(api_url, verify=False)ip_port = res.json()proxie = "http://%s:%d" % (ip_port["data"][0]["ip"], ip_port["data"][0]["port"])proxies = {'http': proxie, 'https': proxie}print(proxies)html = requests.get(url=url, headers=headers, proxies=proxies, verify=False).textprint(html)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

在正式使用代理时,还需要测试一下代理是否可用,这里橡皮擦用到了 IP 检测工具,发现 ipidea 提供的 IP 都是优质 IP,延迟很低,非常不错~

⛳️ 浏览器使用代理

如果你不是 Python 爬虫工程师,仅仅是选择一款代理工具,或者希望将代理应用到浏览器中,在这个代理服务平台上,也找到了相关教程,而且写的非常详细。

可以点击这里进行学习~

⛳️ 重点来了

在这个站点上发现了一个独有的产品:【IPIDEA 网页解锁器】,官网的描述是:
IPIDEA 专业技术研发“网页解锁工具”,实现网页爬虫技术可用率大于 99.99%。无需任何经验,只需轻点发送请求,就可获得准确的可用数据。

不说了,这么好用的功能,我先行一步,一起来吗?(在评论区)点击蓝色字体,收获一个稳定,高质量,高可用,可免费试用的代理 IP 平台!

⛳️ 附赠一个爬虫 - 小吃搜搜乐,弄点小吃数据放在本地

爬取前的分析

在百度搜索省市的名字+小吃,翻阅页面会找到如下内容,每页展示 12 条小吃数据。

随机点击一个页码,通过开发者工具,可以捕获到 API 请求的接口,拿到 API 之后获取数据就变得特别简单了,API 接口地址与参数如下:

sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?resource_id=28589&from_mid=1&&format=json&ie=utf-8&oe=utf-8&query=%E5%8C%97%E4%BA%AC%E5%B0%8F%E5%90%83&sort_key=&sort_type=1&stat0=&stat1=&stat2=&stat3=&pn=12&rn=12&cb=jQuery110200006770667994311363_1605510465709&_=1605510465720
  • 1

URL 参数非常多,简单整理之后,核心的参数如下:

sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?resource_id=28589&query=%E9%A6%99%E6%B8%AF%E5%B0%8F%E5%90%83&pn=1&rn=100
  • 1

参数说明:

  • resource_id=28589 资源类型 固定值
  • query 查询内容,经测试为 省市名字 + 小吃 二字即可
  • pn=1&rn=100 pn 起始条数,rn 每页条数,经测试这两个值可以直接设置为 1 和 100(可以在放大)就可以获取到完整的数据了,不用再按照分页获取展示。

获取到的 JSON 数据格式为:

重要的数据在红框部分,通过 API 获取红框部分数据即可。

在正式编码之前,还需要准备一份中国各省份的名称字典或者元组。

PROVINCE = (    (1, '北京市'),    (2, '上海市'),    (3, '香港'),    (4, '台湾'),    (5, '重庆市'),    (6, '澳门'),    (7, '天津市'),    (8, '江苏省'),    (9, '浙江省'),    (10, '四川省'),    (11, '江西省'),    (12, '福建省'),    (13, '青海省'),    (14, '吉林省'),    (15, '贵州省'),    (16, '陕西省'),    (17, '山西省'),    (18, '河北省'),    (19, '湖北省'),    (20, '辽宁省'),    (21, '湖南省'),    (22, '山东省'),    (23, '云南省'),    (24, '河南省'),    (25, '广东省'),    (26, '安徽省'),    (27, '甘肃省'),    (28, '海南省'),    (29, '黑龙江省'),    (30, '内蒙古自治区'),    (31, '新疆维吾尔自治区'),    (32, '广西壮族自治区'),    (33, '宁夏回族自治区'),    (34, '西藏自治区'))PROVINCE_DICT = dict(PROVINCE)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

分析完毕,就可以进入实际的编码环节了。

小吃数据抓取编码实现

首先按照上述内容分析出来的 URL 格式,用字符串模板结合省份名称批量生成待爬取的 URL 列表。

def get_allurl():    url_format = "https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?resource_id=28589&query={province}小吃&pn=1&rn=100"    urls_tuple = [(province, url_format.format(province=province))                  for province in PROVINCE_DICT.values()]    return urls_tuple
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

拿到该页面可以用单线程去抓取,也可以用多线程直接抓取都可以,由于数据量不大就 34 个省份的数据,简单些直接用单线程爬取即可。

本次依旧将数据存储到 csv 文件中,提前创建一个带列名的 csv 文件。

if __name__ == "__main__":    with open('xiaochi.csv', 'w', newline='') as f:        fieldnames = {"additional", 'ename', 'img',                      'query', "imgScale", "pic_4n_78", "selpic", "province"}        writer = csv.DictWriter(f, fieldnames=fieldnames)        writer.writeheader()    urls_tuple = get_allurl()    get_data(urls_tuple)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

核心代码部分也非常简单,循环上述构造成的待爬取 URL 即可,单线程整体无难度,依旧是对 requests 的一个基础应用。

def get_data(urls_tuple):    # 循环爬取各省份小吃    for url in urls_tuple:        print(f"正在爬取{url[1]}页面小吃数据")        r = requests.get(url=url[1], headers=headers)        time.sleep(2)        # 得到JSON数据        data = r.json()        if data["status"] == 0:            print("数据获取成功")            # 获取result数据            result = data["data"][0]["result"]            if len(result) > 0:                print("小吃数据正常")                # 循环保存数据                for item in result:                    item["province"] = url[0]                    with open('xiaochi.csv', 'a+', newline='') as f:                        fieldnames = {"additional", 'ename', 'img',                                      'query', "imgScale", "pic_4n_78", "selpic", "province"}                        writer = csv.DictWriter(f, fieldnames=fieldnames)                        writer.writerow(item)            else:                print("无小吃数据")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

代码运行之后,控制一下抓取频率,数据会依次保存在本地。

最终抓取到了 2260 条数据,数据量虽说不大,但是可以做很多有意思的事情了。

📣📣📣📣📣📣
右下角有个大拇指,点赞的漂亮加倍

欢迎大家订阅专栏:

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发