目录
urllib是一个python内置包,urllib里面的request模块用于http请求。urlopen()是request模块里面的一个方法。
urlopen方法默认使用GET方式请求数据,返回结果是一个
res.read()方法将响应的报文内容(响应主体信息)进行解码得到一个byte对象。
一般爬虫爬取得到的是前端程序员希望展示给我们看的内容,也就是html文本文件。下面的代码就是简单爬取百度。
- from urllib.request import urlopen
-
- res: object = urlopen(url='http://www.baidu.com/')
- print(res.read().decode())
- print(re.getcode())
- # 200
当我们爬取一个网址时根据返回的状态码识别是否有必要接着爬,如果爬取的网址存在异常则终止爬取。
- print(res.geturl())
- # http://www.baidu.com/
获取网址名称是为了避免重复爬取同一个网址。
- print(res.info())
- # Bdpagetype: 1
- # Bdqid: 0xa555928600017556
- # Content-Type: text/html; charset=utf-8
- # Date: Tue, 26 Jul 2022 05:48:48 GMT
- # P3p: CP=" OTI DSP COR IVA OUR IND COM "
- # P3p: CP=" OTI DSP COR IVA OUR IND COM "
- # Server: BWS/1.1
- # Set-Cookie: BAIDUID=0636:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=21647; path=/; domain=.baidu.com
- # Set-Cookie: BIDUPSID=063FDED22F3; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
- # Set-Cookie: PSTM=165828; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=283647; path=/; domain=.baidu.com
- # Set-Cookie: BAIDUID=06377B:FG=1; max-age=3100; expires=Wed, 26-Jul-23 05:48:48 GMT; domain=.baidu.com; path=/; version=1; comment=bd
- # Set-Cookie: BDSVRTM=0; path=/
- # Set-Cookie: BD_HOME=1; path=/
- # Set-Cookie: H_PS_PSSID=36837_36543666166_36350_36866; path=/; domain=.baidu.com
- # Traceid: 1658814
- # Vary: Accept-Encoding
- # X-Frame-Options: sameorigin
- # X-Ua-Compatible: IE=Edge,chrome=1
- # Connection: close
- # Transfer-Encoding: chunked
Request是模块request里面的一个类,这个类的作用就是封装一个http请求报文,包括http的请求头,请求行,请求体等,也就是header信息,包括User-Agent,Host,Connection,Accept等。
请求报文的作用是应对被爬取网址的一些验证,可以将验证信息封装在请求报文之中,从而通过被爬取网址的验证。
- from urllib.request import Request, urlopen
- from random import choice
-
- User_Agent_dict = {
- 'iPad': 'Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/4.0.2 '
- 'Mobile/8C148 Safari/6533.18.5',
- 'iPhone': "Mozilla/5.0 (iPhone; U; CPU OS 4_2_1 like Mac OS X) AppleWebKit/532.9 (KHTML, like Gecko) Version/5.0.3 "
- "Mobile/8B5097d Safari/6531.22.7 ",
- 'default': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 '
- 'Safari/537.36 '
- }
- user_agent_list = ['iPad', 'iPhone', 'default']
- ua = User_Agent_dict[choice(user_agent_list)]
- req = Request(url='http://httpbin.org/get', headers={'User-Agent': ua})
- resp = urlopen(req)
- print(resp.getcode())
- print(resp.read().decode('utf-8'))
也可以使用pip install fake-useragent安装fake-useragent模块,动态生成各种不同的ua。
- from fake_useragent import UserAgent
- re1 = UserAgent()
- print(re1.ie)
- print(re1.random)
如下图,百度搜索时的参数写在百度域名后边,以?开头,以key:value的形式添加,如wd=常见的UA。
使用GET方式发送请求时,请求报文的主体信息就会在网址后面以?key1:value1&key2:value2&key3:value3……的形式添加。
但是url存在自己的规范,url中反斜杠\等特殊字符会引起不必要的错误,所以应该将可能带来错误的字符串参数进行转码。比如将字符串'\n我爱你'进行转码得到%5Cn%E6%88%91%E7%88%B1%E4%BD%A0。当出现中文时一般要转码。
两个转码方法:from urllib.parse import urlencode的urlencode方法,参数是一个字典,会将字典的键和值直接进行拼接,并将每一个参数使用&连接。
其二,from urllib.parse import quote的quote方法,直接将一个字符串转码成url中使用的字符。
- from urllib.request import Request, urlopen
- from urllib.parse import quote # 将字符串参数进行转码,从而得到一个规范的url地址
- from fake_useragent import UserAgent
-
- ua = UserAgent().random
- wd = quote(r'\n我爱你')
- print(wd)
- url = 'https://www.baidu.com/s?wd={keyword}'.format(keyword=wd)
- req = Request(url=url, headers={'User-Agent': ua})
- resp = urlopen(req)
- print(resp.getcode())
- print(resp.read().decode())
- print(resp.info())
下面的代码用于接收搜索关键字并百度搜索这个关键字。
- from urllib.request import Request, urlopen
- from urllib.parse import urlencode # 将字符串参数进行转码,从而得到一个规范的url地址
- from fake_useragent import UserAgent
-
- ua = UserAgent().chrome
- args = input('请输入搜索内容')
- keyw = {
- 'wd': args,
- 'ie': 'utf-8'
- }
- paras = urlencode(keyw)
-
- url = 'https://www.baidu.com/s?{0}'.format(paras)
- req = Request(url=url, headers={'User-Agent': ua})
- resp = urlopen(req)
- print(resp.getcode())
- print(resp.read().decode())
- print(resp.info())