测试环境是python 3.8.1
urllib urllib提供了一系列用于操作URL的功能。 urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应。
使用pip下载:
例如对百度搜索界面的抓取(www.baidu.com )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import urllibfrom urllib import requestif __name__ == "__main__" : headers = { 'Connection' : 'Keep-Alive' , 'Accept' : 'text/html, application/xhtml+xml, */*' , 'Accept-Language' : 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3' , 'Accept-Encoding' : 'gzip, deflate' , 'User-Agent' : 'Mozilla/6.1 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko' , 'Host' : 'www.so.com' , 'Referer' : 'https://www.so.com' } respond = urllib.request.urlopen('http://www.baidu.com' , headers=headers) print (respond.read().decode('utf-8' ))
参考网站:廖雪峰的官方网站
urllib3 urllib3是一个功能强大且友好的Python HTTP客户端。大多数Python生态系统已经使用urllib3,您也应该使用。urllib3带来了Python标准库中缺少的许多关键功能:
线程安全。 连接池。 客户端SSL / TLS验证。 使用分段编码上传文件。 重试请求和处理HTTP重定向的助手。 支持gzip,deflate和brotli编码。 HTTP和SOCKS的代理支持。 100%的测试覆盖率。 urllib3功能强大且易于使用: 下载:
例如抓取百度搜索界面(www.baidu.com )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import urllib3if __name__ == "__main__" : http = urllib3.PoolManager() headers = { 'Connection' : 'Keep-Alive' , 'Accept' : 'text/html, application/xhtml+xml, */*' , 'Accept-Language' : 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3' , 'Accept-Encoding' : 'gzip, deflate' , 'User-Agent' : 'Mozilla/6.1 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko' } r=http.request('GET' , 'http://www.baidu.com' , headers=headers) print (r.data)
requests 我们已经讲解了Python内置的urllib模块和其升级版urllib3,用于访问网络资源。但是,它用起来比较麻烦,而且,缺少很多实用的高级功能。
更好的方案是使用requests。它是一个Python第三方库,处理URL资源特别方便。 下载:
注意有 s 在==requests==中
例如抓取360搜索结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 import requestsif __name__ == '__main__' : keyword = "123sad" keyword = input ("请输入你想搜索的内容" ) try : headers = { 'Connection' : 'Keep-Alive' , 'Accept' : 'text/html, application/xhtml+xml, */*' , 'Accept-Language' : 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3' , 'Accept-Encoding' : 'gzip, deflate' , 'User-Agent' : 'Mozilla/6.1 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko' , 'Host' : 'www.so.com' , 'Referer' : 'https://www.so.com' } page = 1 kv = {'q' : keyword, 'ie' : 'utf-8' , 'pn' : page} r = requests.get("http://www.so.com/s" , headers=headers, params=kv) print ('url:' +r.request.url) r.raise_for_status() html = r.text print (html) except requests.HTTPError as a: print (a) print ("爬取失败" ) except : print ('失败' )
参考网站:廖雪峰的官方网站
笔者在爬取时遇到的问题 1.结果不全 笔者在vs code 中执行时,结果显示不全 如果结果显示不全,需要在cmd中执行文件
2.‘抓取失败’ 显示该问题,一般是因为IP被屏蔽 目前很多搜索引擎都装备了反爬虫,这个时候需要重启路由器(重新拨号)或者挂代理(proxy),或者试一试别的搜索引擎,笔者抓取百度时频繁出现错误,只能抓取360搜索
3.返回乱码 对返回结果解码
进阶 urllib parse 使用parse模块拼接参数:
1 2 3 params = {'ie' : 'utf-8' , 'wd' : 'python是这个世界上最好的语言' } url = 'www.baidu.com/s?' +urllib.parse.urlencode(params) print (url)
结果:
1 www.baidu.com/s?ie=utf-8&wd=python%E6%98%AF%E8%BF%99%E4%B8%AA%E4%B8%96%E7%95%8C%E4%B8%8A%E6%9C%80%E5%A5%BD%E7%9A%84%E8%AF%AD%E8%A8%80
error 在urllib中设置了两个主要异常类,一个是URLError,一个是HTTPError
1 2 3 4 5 6 7 8 try :... except urllib.error.HTTPError as e: print (e.code) print (e.reason) pring(e.headers) except urllib.error.URLError as e: print (e)
re库 re库是用来分析网页返回结果的正则库 安装:
正则:
1 2 3 4 import repattern = re.compile ( r'<li class="res-list" data-lazyload="1"><h3 class="res-title "><a href="(.*?)"' , re.S) results = pattern.findall(html)
其中,re.compile 是创建正则式,findall 是在文本中匹配全部,并返回数组格式的数据 有关正则表达式写法和更多数据请看官方文档
笔者推荐使用requests库
beautifulsoup Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间. pip安装:
如果要使用lxml解析器
请参考博客园 ,因为下载太慢,笔者使用html解析器
使用beautifulsoup提取指定的html元素:
1 2 3 4 5 6 7 8 soup = BeautifulSoup(req.text, "html" ) soup.find(name="div" , attrs={"class" :"a" ,"id" :"b" }) soup.select(".a" ) human_list=beautifulsoup("<p class='a'></p>" ) print (human_list.p["class" ])
如果要取html元素里的内容,用xx.string
或者.text参考链接 点我跳转官方文档
例子: 以下代码爬取了https://www.baidu.com/s?ie=UTF-8&wd=afs
的第一条搜索结果的名字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import requestsfrom bs4 import BeautifulSoupurl = "https://www.baidu.com/s?ie=UTF-8&wd=afs" headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36' } req = requests.get(url, headers=headers) soup = BeautifulSoup(req.text, "html" ) human_list=soup.find(name="div" , attrs={"class" :"c-abstract" }) human_list=str (human_list) human_list=human_list.replace('<div class="c-abstract c-abstract-en">' ,"" ) human_list=human_list.replace("</div>" ,"" ) human_list=human_list.replace("\n" ,"" ) print (human_list)
输出:
1 <em > AFS</em > study abroad, education and volunteer programs empower people of all ages and backgrounds with essential intercultural knowledge, skills and understanding.
END