Python 爬虫入门、User Agent、代理IP、Cookie

Python 爬虫入门、User Agent、代理IP、Cookie

总结一下最近几天学习的python爬虫,说一下在这过程中踩的坑。

最简单的爬虫

代码如下:

import urllib.request as ur

request = ur.urlopen('https://edu.csdn.net/')
html = request.read()
print(html)

上面的这三行代码实际是两行代码可以组成最简单的爬虫,首先导入 urllib 库,使用 request = urllib.request.urlopen(url) 打开url,然后使用 html = request.read() 读取下载的html,最后打印读取到的html,这样一个简单的最简单的爬虫就写完了。

但是大多数网站都会进行反爬虫,为什么要反爬虫呢?因为每个服务器的资源是有限的,比如某一个服务器的连接数只能有3个,也就是说同时只能有三个用户连接服务器。当服务器已经有2和用户连接时,这个时候你使用爬虫去爬取人家的网站,最后一个连接被你占了,那人家的服务器就不能被真正的用户使用了,本来人家的服务器资源就不是很充裕,你还去占用,人家肯定不高兴,不高兴怎么办呢?就会使用反爬虫的技术手段。

一般的反爬虫的技术有,User Agent的使用、ip限制、登录限制等,我主要会说一下User Agent、代理ip、Cookie这三个方面。

User_Agent

User-Agent是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。用较为普通的一点来说,是一种向访问网站提供你所使用的浏览器类型、操作系统及版本、CPU 类型、浏览器渲染引擎、浏览器语言、浏览器插件等信息的标识。User Agent字符串在每次浏览器 HTTP 请求时发送到服务器!

浏览器User Agent字符串的标准格式为: 浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识 版本信息。

由于在使用浏览器访问一个网站时,浏览器会把本地主机的一些信息发个服务器其中就包括浏览器的各种信息,服务器就可以根据这个来判断正在访问的是不是浏览器。使用User Agent进行反爬虫就是使用的这个原理。

怎么解决呢?不用担心,服务器不是要这个User Agent的信息吗,那我们在爬取的时候给它不就行了吗。这个User Agent该怎么写呢?不用担心这个可以在搜索引擎上搜索,我这里也有一份 点击下载

这里要使用User Agent代码就要修改了,首先在url读取时要修改为 

import urllib.request as ur

request = ur.Request('https://edu.csdn.net/')
response = ur.urlopen(request)
html = response.read()
print(html)

为什么在读取url的时候要首先使用 Request 包装一下呢?这个你看源码就可以只能 这个Request里可以传 headers 参数,这个headers参数里包含了 User Agent 信息。代码修改如下

import urllib.request as ur

request = ur.Request(
        url=url,
        headers={
            "User-Agent": "你的 User Agent 字符串",
        }
    )
response = ur.urlopen(request)
html = response.read()
print(html)

这样你的爬虫就可以伪装成浏览器了。

Cookie

Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。

虽然我们的爬虫伪装成了浏览器但是还不够,因为有一些网站是需要登录才能访问的,比如淘宝的搜索、QQ空间等,这时就可以使用Cookie来进行模拟登录。

下面以登录CSDN为例

Cookie字符串的获取,首先打开浏览器并登录CSDN账号,然后按下F12打开浏览器的调试界面,然后点击Network,然后在点击All。

然后刷新网页,刷新网页加载完后如下,

然后点击第一行,在右边的Headers里找到Cookie,复制里面的内容,这里就是登录后的Cookie字符串。

代码修改如下

import urllib.request as ur

request = ur.Request(
        url=url,
        headers={
            "User-Agent": "你的 User Agent 字符串",
            'Cookie': "你的 Cookie 字符串",
        }
    )
response = ur.urlopen(request)
html = response.read()
print(html)

这样就可以访问到需要登录的页面了,访问其他需要的登录的页面方法类似。

注意这里有坑

通过上面的方法我们获取到了Cookie,在实际浏览网页时我们每一次跳转页面Cookie里的内容都会改变,所以当我们获取到Cookie后就不要用我们刚刚使用的那个浏览器继续访问这个站点了,不然会出现一些错误,我们关闭网页后重新打开。这里可以参考 Cookie 的解释。

代理IP

虽然我们的爬虫已经可以伪装成浏览器并且可以访问到需要登录的页面但是还是不够的,服务器会检测一个ip对服务器的访问频率。一般我们浏览网页的时候是使用手点击鼠标,然后在跳转网页,这个过程与程序来说是很慢的,所以当一个ip高频率的访问网站时服务器就会认为这是一个爬虫在访问而不是一个人在访问网站,这时服务器就睡限制这个ip的访问。遇到这种情况怎么办呢?代理ip就出现了。

服务器不是会限制某一段时间内某个ip的高频率访问吗,那我们就切换不同的ip的去访问不就行了吗。

代理IP的获取

有一些比较好的免费的代理ip如 66免费代理网89免费代理K快代理等,也有一些付费的代理ip可以自行百度查询。

这里我使用的是66免费代理网的代理ip,api为 

http://www.66ip.cn/mo.php?sxb=&tqsl=2&port=&export=&ktip=&sxa=&submit=%CC%E1++%C8%A1&textarea=http%3A%2F%2Fwww.66ip.cn%2F%3Fsxb%3D%26tqsl%3D15%26ports%255B%255D2%3D8123%2C8585%2C80%26ktip%3D%26sxa%3D%26radio%3Dradio%26submit%3D%25CC%25E1%2B%2B%25C8%25A1

返回的是html所以需要我们自己去解析html,解析代码如下

def get_proxy_address():
    ip_api = '代理IP的api'
    proxy_address_html = ur.urlopen(ip_api).read()
    proxy_address_html = proxy_address_html.decode('gb2312').strip()
    proxy_address_html = re.sub('\n', '', proxy_address_html)
    proxy_address_pattern = '\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}:[0-9]*'
    proxy_address = re.findall(proxy_address_pattern, proxy_address_html)
    return proxy_address

代理ip的使用

1、创建 ProxyHeader

proxy_header = ur.ProxyHandler(
    {
        'http': proxy_address  # ip地址 ip:port
    }
)

2、创建 opener对象

proxy_opener = ur.build_opener(proxy_header)

3、使用代理ip打开url并下载html。

request = ur.Request(url='https://edu.csdn.net')
reponse = proxy_opener.open(request).read()
print(reponse)

总体代码

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Time    : 2019/9/27 15:22
@Author  : Code_Boy_Code
@File    : user_agent.py
@Software: PyCharm
@Desc    : 
"""
import json
import random

user_agent_json = None


def load_user_agent(user_agent_path):
    global user_agent_json
    with open(user_agent_path, 'r')as f:
        user_agent_json = json.load(f)


def get_user_agent_pc():
    """随机返回一个user-agent"""
    return random.choice(user_agent_json[random.choice(list(user_agent_json.keys()))])
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Time    : 2019/9/27 19:30
@Author  : Code_Boy_Code
@File    : csdn.py
@Software: PyCharm
@Desc    : 
"""
import re
import user_agent
import urllib.request as ur

user_agent_path = './user-agent.json'
user_agent.load_user_agent(user_agent_path)  # 加载user_agent


def getRequest(url):
    return ur.Request(
        url=url,
        headers={
            'User-Agent':  user_agent.get_user_agent_pc(),
            'Cookie': "你的 Cookie 字符串",
        }
    )


def get_proxy_address():
    ip_api = ''
    proxy_address_html = ur.urlopen(ip_api).read()
    proxy_address_html = proxy_address_html.decode('gb2312').strip()
    proxy_address_html = re.sub('\n', '', proxy_address_html)
    proxy_address_pattern = '\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}:[0-9]*'
    proxy_address = re.findall(proxy_address_pattern, proxy_address_html)
    return proxy_address


def getProxyOpenner():
    proxy_address = get_proxy_address()
    proxy_headler = ur.ProxyHandler(
        {
            'http': proxy_address[0]
        }
    )
    return ur.build_opener(proxy_headler)


url='https://edu.csdn.net'
request = getRequest(url)

proxy_opener = getProxyOpenner()  # 设置代理IP
response = proxy_opener.open(request).read()
print(response)

最后介绍一下我个人的公众号

这个公众号主要用于Java、C#、Python的学习分享和交流。要不要搞事情呀就差你啦!

 

参考文章:

User-Agent详解

Cookie

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值