urllib基础-构造请求对象,设置用户代理User-Agent
有的网页具有一些反爬机制,如:需要浏览器请求头中的User-Agent。User-Agent类似浏览器的身份证。
程序中不设置User-Agent。默认是Python-urllib/3.5。这样网站就知道是程序(而不是人)在访问,有的网站(如:西刺代理)就不会响应这样的请求。
程序中要设置浏览器请求头,通过将request.urlopen()中传入请求对象。请求对象中包含爬取的目标网页url,和浏览器的请求头内容,为了防止反爬机制,因为程序的请求速度很快,我们不是一直使用同一个请求头,我们在一个列表中存放很多请求头,每次请求时,随机在数组中获取一个请求头。
1 from urllib import request
2 import random
3
4 # 确定爬去目标
5 base_url = 'http://www.xicidaili.com'
6
7 url_agents = [
8 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
9 'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11',
10 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
11 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'
12 ]
13 # 构建请求头
14 headers = {
15 #随机获取浏览器身份请求头
16 'User-Agent':random.choice(url_agents)
17 }
18
19 # 构建请求对象
20 req = request.Request(url=base_url,headers=headers)
21
22 # 发起请求
23 response = request.urlopen(req)
24
25 #获取请求内容
26 html = response.read().decode('utf-8')
27
28 # 打印爬取的网页内容
29 print(html)
- request.urliopen()的参数可以是一个请求地址,也可以是一个请求对象。
- resquest.Reaquest(url=base_url,headers=headers)
url是请求的地址,headers是请求头内容。
headers请求头是一个字典。请求头包含的内容可以通过浏览器查看。
- random.choice(url_agent)
随机从url_agent列表中获取一个元素
本例中构建了一个用户代理池,每次亲故随机获取User-Agent的信息。