爬虫入门之模拟用户请求

接着上一篇文章 Python爬虫入门之初遇lxml库,我们说一下如何模拟用户请求,因为大多数网站都是有防爬虫措施的

学习爬虫要了解web知识,我们需要通过http请求头来伪装自己爬虫程序

1.修改请求头

这里要用到python的urllib.request的模块,首相介绍一下http请求头,它就是你每次在访问网页时,向服务器传输的一组属性和配置信息。下面有七个字段被大多数浏览器用来初始化网络请求。

属性

内容 说明
Host www.baidu.com 表示我们访问的主机
Connection keep-alive 表示是否保持连接
Accept text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 客户端可以接收端返回数据类型
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.2 Safari/605.1.15 用户通过什么方式访问的服务器,我这里是safari浏览器,还可以设置通过手机、ipad
Referrer https://www.baidu.com/ 表示从哪里进入此网站的,比如从a网址跳转到b网址,那么访问b的时候这里的值就是a
Accept-Encoding gzip,deflate,sdch 接受的编码格式
Accept-Language en-cn,en;q=0.8 接受的语言

这是是用户在访问网页时所发出的host请求(表格中是我的电脑发起的请求,打开F12可查看自己的host请求)。下面看一下为不加请求头时python爬虫发出的请求。

Accept-Encoding identity
User-Agent

Python- urllib/3.7

下面我们通过python代码来模拟一下用户请求

import urllib.request

url = "https://www.baidu.com/"

def mkhead():
    header = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'zh-cn',
        'Connection': 'keep-alive',
        'Host': 'www.baidu.com',
        'Referer': 'https://www.baidu.com/',
        'Cookie': 'uuid_tt_dd=10_35489889920-1563497330616-876822;',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) '
                      'Version/14.0.2 Safari/605.1.15'}
    return header


header = mkhead()
req = urllib.request.Request(url=url, headers=header)
html_resp = urllib.request.urlopen(req).read().decode("utf-8")
print(html_resp)

2.设置爬取间隔时间

如果访问网址过于频繁会被有些服务器的反爬虫程序认为是被爬虫恶意请求,这时候我们就要设置爬取数据的频率

比如说最简单的方式用如下代码

import time

time.sleep(3)  # 让线程休息三秒

3.使用ip代理

有时候即使设置了爬取的间隔时间,还是会被服务器判别是爬虫程序,是因为我们的爬虫程序都是通过自己的ip地址发起请求,同一个ip访问次数过多会被服务器反爬虫机制直接拒绝

这时候我们要设置ip代理去发起请求

proxy_ip = “ip:port”
proxy_handler = urllib.request.ProxyHandler({'http': proxy_ip})
opener = urllib.request.build_opener(proxy_handler)
print(f"proxy_ip:{proxy_ip}\tlink:{self.link}")
headers = (
            'User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) '
                          'Version/14.0.2 Safari/605.1.15')

opener.addheaders = [headers]
html_resp = opener.open(self.link).read().decode("utf-8")

proxy_ip是我们的ip代理,ip代理商有很多,有钱的话可以直接去购买

4.人机验证

目前遇到人机验证、验证码的需要采用第三方的识别验证码方式

5.ajax请求

有些网页一请求并没有数据,是通过ajax异步获取来的数据,这时候就需要我们模拟ajax请求来抓取数据

6.参数js加密

稍后补充

7.cookie限制

打开浏览器按f12,把cookie复制,放入请求头

总结

目前就学到这么多,先总结一下,文中有什么问题可以指出来,学到更多了再继续补充

正文到此结束
评论插件初始化中...
Loading...