爬虫基本原理介绍、实现以及问题解决

爬虫基本原理介绍、实现以及问题解决


Part1 一、爬虫的意义

1.爬虫能做什么

其实爬虫的主要目标就是通过大量自动化进行目标网站的访问,获取公开的数据,方便我们进行数据 统计或者数据整合。其中公开shuju一定要注意,就是一定是网页可以公开访问的数据进行访问,否则是违法的哦,容易面向监狱编程。另外就是一定要注意访问的频次,不能对原始网站造成危害(一般都会做限制了)。不然会变成一只有毒的爬虫。

2.爬虫有什么意义

其实爬虫主要做的事情就是数据的收集,接下来就可以做数据的处理,企业可以用这些数据来进行市场分析,把握商机,就行买股票一样,有大量的历史数据我们就可以尝试去预测市场走势,押中了就是一次机会。另外现在人工智能这么火爆,但是人工智能的基础就是大数据,我们听说过训练集其实就是大数据,我们有时候拿不到现成的数据集的时候就需要进行爬虫拿到我们的数据基础。


Part2 二、爬虫的实现

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 rqfrom 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字段,也就是我们想要总的刷题数。但是我们尝试对大量数据进行访问的时候我们就会看到访问频次的限制。


Part3 三、反爬解决方案

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 pythonimport jsonimport threadingimport timeimport requests as rqfrom 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,自动切换,让我们的信息更加安全。完善文档支持对于不同语言都有对应的实例文档,方便我们快速上手。


如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以V扫描下方二维码免费领取🆓

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值