爬虫-get方法-笔记

爬虫练习

Robots协议

指定一个 robots.txt 协议,告诉爬虫引擎什么可以爬取

例如:
https://mp.csdn.net/robots.txt
User-agent: *
所用用户
Disallow: /
不允许爬取任何内容
不允许任何爬虫爬取任何内容

urllib包

urllib.request 用于打开和读写url
urllib.error 包含了由 urllib.request 引起的异常
urllib.parse 用于解析url
urllib.robotparser 用于分析robots.txt文件

urlopen

urlopen(url, data=None)

url为链接地址的字符串或请求对象
data为提交的数据,如果data为None发起GET请求,否则发起POST请求
urlopen()返回的是一个http.client.HTTPResponse类的响应请求,这是一个类文件对象。

User-agent

爬虫向浏览器发送的请求中包含爬虫的User-agent信息,如果不加以修改,网站就会识别出爬虫,并阻止其爬取网页信息,所以要通过Request类来进行伪装。

# urllib.request.OpenerDirector
class OpenerDirector:
    def __init__(self):
        client_version = "Python-urllib/%s" % __version__
        self.addheaders = [('User-agent', client_version)]

另外,通过查看request源代码可以知道,request默认的ua为:Python-urllib/3.6 要是不加伪装很容易被识别为爬虫

Request类

Request(url, data=None, headers={})
Request类传递的参数与urlopen相似,其中headers为可以定制的请求头默认为字典,所以headers的赋值应当为键值对
不进行伪装的请求:

url = 'http://www.bing.com'
request = Request(url)

重新编写User-agent的请求,将爬虫伪装成浏览器对网站进行访问:

url = 'http://www.bing.com'
ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
request = Request(url, headers = {
     
	'User_agent': ua
})

伪装多个ua对网站进行访问:

from urllib.request import urlopen, Request
from http.client import HTTPResponse
import random

url = 'http://www.bing.com'
ua_list = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
    'Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11'
]
ua = random.choice(ua_list)  # 在 ua_list 中随机选取一个User_agent
request = Request(url)
request.add_header('User-Agent', random.choice(ua_list))

# 使用ua来伪装爬虫,向网站声称自己是ua所代表的浏览器
# urlopen(url, date=None)
# url是链接地址字符串,或请求对象。
# date为请求数据,如果date为None则发起get请求,否则发起Post请求
# 默认为None
response = urlopen(request, timeout=5)
# 通过 urlopen 方法,发起一个HTTP的GET请求,WEB服务器返回了网页内容。相应
# 的数据被封装到类文件对象中,可以通过read方法、readline方法、readlines方法
# 获取数据

print(response.closed)

with response:
    print(type(response))  # http.client.HTTPReasponse
    print(response.status)   # 状态
    print(response._method)
    print(response.read())  # 读取返回的内容
    # print("\ninfo:")
    # print(response.info())  # 返回头信息 headers
    print(response.geturl())  # 返回真正的url

print(request.get_header('User-agent'))
print(response.closed)

步骤:

  1. 编写 url、ua,确定访问对象和进行伪装
  2. Request(url, headers={})制作请求头,将url,ua作为参数传入
  3. urlopen(request, timeout)对网站发送请求,返回一个类文件对象
  4. 读取信息

你可能感兴趣的:(python爬虫,python)