关于python:爬虫基本原理介绍实现以及问题解决

4次阅读

共计 4429 个字符,预计需要花费 12 分钟才能阅读完成。

文章目录
一、爬虫的意义
1. 前言
2. 爬虫能做什么
3. 爬虫有什么意义
二、爬虫的实现
1. 爬虫的根底原理
2.api 的获取
3. 爬虫实现
三、反爬解决方案
1. 反爬的实现形式
2. 反爬的解决办法
3. 反爬的实现代码
4.IPIDEA 还能做什么
四、总结

一、爬虫的意义
1. 前言
最近拉开了毕业季的尾声,提前批开启了大厂抢人模式,所以很多人都开始在力扣刷题,心愿可能在大厂抢人的期间怀才不遇。为了能实现群内力扣刷题排名就须要对力扣网站进行数据爬取,最近就对爬虫的机制和爬虫的意义进行了理解。

2. 爬虫能做什么
其实爬虫的次要指标就是通过大量自动化进行指标网站的拜访,获取公开的数据,不便咱们进行数据 统计或者数据整合。其中公开 shuju 肯定要留神,就是肯定是网页能够公开拜访的数据进行拜访,否则是守法的哦,容易面向监狱编程。另外就是肯定要留神拜访的频次,不能对原始网站造成危害(个别都会做限度了)。不然会变成一只有毒的爬虫。

3. 爬虫有什么意义
其实爬虫次要做的事件就是数据的收集,接下来就能够做数据的解决,企业能够用这些数据来进行市场剖析,把握商机,就行买股票一样,有大量的历史数据咱们就能够尝试去预测市场走势,押中了就是一次机会。
另外当初人工智能这么火爆,然而人工智能的根底就是大数据,咱们据说过训练集其实就是大数据,咱们有时候拿不到现成的数据集的时候就须要进行爬虫拿到咱们的数据根底。

二、爬虫的实现
1. 爬虫的根底原理
爬虫其实就是主动拜访相应的网站,拿到咱们想要的数据。比方咱们想要查快递,就会一直的拜访一个网页,去看最新的进度,爬虫就是去模仿这个过程,同时为了提高效率可能会省略一些步骤。咱们这次就以力扣的刷题总数做例子。

2.api 的获取
咱们关上力扣的主页的时候肯定会进行数据的拜访拿到一些信息,咱们关上开发者模式,就能够看到每一条申请。例如下图:

右侧就是我的主页其中的一条数据库申请内容,他用的语法是 graphql,赶趣味咱们下次再讲,咱们只有用就行了。
咱们其实能够对申请头进行精简,失去上面的 graphql 语法:

payload = {"operation_name": "userPublicProfile",   #查询数据库申请内容
    "query": '''query userPublicProfile($userSlug: String!) {userProfilePublicProfile(userSlug: $userSlug) {
    username
    submissionProgress {acTotal}
}
}
''',"variables":'{"userSlug":"查问对象"}'
}

3. 爬虫实现
咱们间接对下面结构的拜访形式进行拜访,看看失去了什么:

import requests as rq
from urllib.parse import urlencode

headers={       #申请头信息
    "Referer":"https://leetcode.cn",
}

payload = {"operation_name": "userPublicProfile",   #查询数据库申请内容
    "query": '''query userPublicProfile($userSlug: String!) {userProfilePublicProfile(userSlug: $userSlug) {
    username
    submissionProgress {acTotal}
}
}
''',"variables":'{"userSlug":"romantic-haibty42"}'
}

res = rq.post("https://leetcode.cn/graphql/"+"?"+ urlencode(payload),headers = headers)
print(res.text)

能够从下面的发现咱们拿到了 acTotal 字段,也就是咱们想要总的刷题数。然而咱们尝试对大量数据进行拜访的时候咱们就会看到拜访频次的限度。

三、反爬解决方案
1. 反爬的实现形式
很多网站罕用的一种反爬的形式是对单 ip 进行限度,如果一个 ip 在肯定的工夫内大量拜访,那么就会不再返回信息,而是返回谬误。次要是数据库的日志零碎会对拜访进行记录。

2. 反爬的解决办法

Ipidea 是一个 IP 代理平台,为寰球用户提供优质大数据代理服务,目前领有千万级实在住宅 IP 资源,蕴含超过 220 个国家和地区,日更新超过 4000 万,汇聚成代理服务池并提供 API 接入,反对 http、https、socks5 等多种协定类型,并且领有 API 模式和账号密码多种应用形式,十分易于上手。官网地址

3. 反爬的实现代码
其实咱们有了下面的代码之后再退出到 ipidea 就会很简略,只有咱们去官网下示例代码,而后插入咱们的代码就行了:

只有咱们将代码中的 tiqu 换成咱们的提取链接,而后将咱们的代码放到外围业务的 try 外面就能够实现了。
不过我为了应用 socks5 代理形式进行了批改,完整版代码如下:

# coding=utf-8
#!/usr/bin/env python
import json
import threading
import time
import requests as rq
from urllib.parse import urlencode

headers={"Referer":"https://leetcode.cn",}

payload = {"operation_name": "userPublicProfile",
    "query": '''query userPublicProfile($userSlug: String!) {userProfilePublicProfile(userSlug: $userSlug) {
    username
    submissionProgress {acTotal}
}
}
''',"variables":'{"userSlug":"kingley"}'
}

username = "romantic-haibty42"

def int_csrf(proxies,header):
    sess= rq.session()
    sess.proxies = proxies
    sess.head("https://leetcode.cn/graphql/")
    header['x-csrftoken'] = sess.cookies["csrftoken"]

testUrl = 'https://api.myip.la/en?json'


# 外围业务
def testPost(host, port):
    proxies = {'http': 'socks5://{}:{}'.format(host, port),
        'https': 'socks5://{}:{}'.format(host, port),
    }
    res = ""

    while True:
        try:
            header = headers
            # print(res.status_code)
            chaxun = payload
            chaxun['variables'] = json.dumps({"userSlug" : f"{username}"})
            res = rq.post("https://leetcode.cn/graphql/"+"?"+ urlencode(chaxun),headers = header,proxies=proxies)
            print(host,res.text)
        except Exception as e:
            print(e)
        break


class 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 类型的返回值 socks5 形式
tiqu = ''

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 = 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
    break

实现后果如下:

短时间大量拜访也不会进行限度啦。

4.IPIDEA 还能做什么

全局动静住宅代理
动静代理笼罩寰球 240+ 国家地区,且均为实在的家庭住宅 ip,这意味着申请的成功率更好,且数据的真实性更高。
多种调用形式
反对 api 接口调用、账号密码调用以及插件代理,使咱们的利用老本大大降低。
定制应用时效
进口 IP 时效能够本人设置,或者每次进行更换,能够让咱们应用更加灵便。
高匿隧道
隧道直达,反对高并发,不同端口的进口为不同的 ip,主动切换,让咱们的信息更加平安。
欠缺文档反对
对于不同语言都有对应的实例文档,不便咱们疾速上手。

四、总结
明天咱们讲了爬虫的基础知识,还能拿到力扣的刷题数据,甚至咱们还利用 IPIDEA 逃脱了力扣的拜访限度。大家快动动手指尝试一下吧。置信大家都能把握爬虫的根本实现形式,不过要留神要留神文化的爬虫哦。
另外,置信有着平安爱护等等多种性能的 IPIDEA 肯定会对企业有很大的意义,如果你企业有这方面的懊恼,无妨试试这款神器,限度注册就送 1G 流量哦。官网地址

文末送书
赠送书籍:《架构根底》
赠送数量:5
赠送规定:本文三连并分享
进抽奖群:加臻哥福利小助手进群(szzdzhp002) 回复暗号:19

本书不波及任何具体的编程语言,采纳大量的架构图、流程图、状态图、时序图等来图解企业级架构,更加清晰直观。每个章节都以场景化案例进行分析,从需要、问题、解决方案、原理、设计办法、落地计划等多个角度,给出架构设计办法。能够依据本书目录查找对应的场景设计,参考利用在企业零碎建设中。以阿里云 / 腾讯云音讯零碎、支付宝 / 微信领取零碎、鹰眼业务监控零碎、监管批量信息报送零碎作为实战案例,具体解说架构设计过程,对外围性能、设计、数据结构加以分析,坚固读者的架构思维和设计能力

文章知识点与官网常识档案匹配,可进一步学习相干常识。以上是分享的全部内容,心愿对大家有所帮忙学习,

正文完
 0