指定一个 robots.txt 协议,告诉爬虫引擎什么可以爬取
例如:
https://mp.csdn.net/robots.txt
User-agent: *
所用用户
Disallow: /
不允许爬取任何内容
不允许任何爬虫爬取任何内容
urllib.request 用于打开和读写url
urllib.error 包含了由 urllib.request 引起的异常
urllib.parse 用于解析url
urllib.robotparser 用于分析robots.txt文件
urlopen(url, data=None)
url为链接地址的字符串或请求对象
data为提交的数据,如果data为None发起GET请求,否则发起POST请求
urlopen()返回的是一个http.client.HTTPResponse类的响应请求,这是一个类文件对象。
爬虫向浏览器发送的请求中包含爬虫的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(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)
步骤: