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的信息。