requests库的运用
import requests
#在使用前需要先通过 import 来引入 requests 库
res = requests.get('url')
#我们通过调用requests库中的get()方法来获取数据,这个方法需要一个参数,这个参数就是你需要请求的网址。当请求得到「响应」时,服务器返回的数据就被赋值到 res 这个变量上面
response对象
Python和Java相似,都是面对对象的编程语言,在程序员眼中万物皆是对象,这里的response也是一个对象,它有自己的属性和方法,了解了数据的对象我们就可以去调用它的属性和方法,上面的requeses.get()得到的就是一个response对象
import requests
res = requests.get('url')
print(type(res))
#打印变量res的数据类型
python main.py
<class 'requests.models.Response'>
代码运行结果显示,res是一个对象,它是一个requests.models.Response类。接下来我们就要利用Response对象的属性和方法来提取数据
Response对象的四大常用属性:
属性 | 运用 |
---|---|
response.status_code | 检查请求是否成功 |
response.content | response对象的二进制数据 |
response.text | response对象的字符串数据 |
response.encoding | response对象的编码 |
(1)response.status_code这个属性表示响应状态判断是否运行成功
import requests
res = requests.get('url')
print(res.status_code)
#打印变量res的响应状态码,以检查请求是否成功
python main.py
200
输出结果为200表示成功,还有其他反馈结果如下
响应状态码 | 说明 | 例子 | 例子说明 |
---|---|---|---|
1×× | 请求接受 | 100 | 继续请求 |
2×× | 请求成功 | 200 | 成功请求 |
3×× | 重定向 | 305 | 应代理访问 |
4×× | 客服端错误 | 403 | 禁止访问 |
5×× | 服务器错误 | 503 | 服务器不可用 |
(2)response.content保存服务器返回数据的二进制的内容,比如下载图片
import requests
res = requests.get('url')
#发出请求,并把返回的结果放在变量res中
pic=res.content
#把Reponse对象的内容以二进制数据的形式返回
photo = open('网页图片名.png','wb')
#图片内容需要以二进制wb读写
photo.write(pic)
#获取pic的二进制内容
(3)response.text属性就是将 response.content 的二进制数据转换为字符串,适用于文字或者是网页源代码的下载
import requests
#引用requests库
res = requests.get('url.txt')
#将返回的 response 对象保存到 res 变量中
novel=res.text
#把Response对象的内容以字符串的形式返回
print(novel)
#现在,可以打印纯文本网页文字了
(4)response.encoding属性代表了response对象的编码,简单来说一般编码就是utf-8这里就不过多赘述了
网络爬虫规范
对于服务器来说,它是不允许恶意爬虫和高频次请求的爬虫,因为这可能会导致服务器崩溃。不过在一般情况下,服务器都是允许搜索引擎的爬虫在规则允许的情况下对网站进行爬取,收录。这些规则,就写在每个网站的 Robots 协议中。 查看 Robots 协议的话,只需要在域名后加入 /robots.txt 就可以查看了。Robots协议是互联网爬虫的一项公认的道德规范,它的全称是“网络爬虫排除标准”(Robots exclusion protocol),这个协议用来告诉爬虫,哪些页面是可以抓取的,哪些不可以。
User-agent: *
Disallow: /subject_search
Disallow: /amazon_search
Disallow: /search
Disallow: /group/search
Disallow: /event/search
Disallow: /celebrities/search
Disallow: /location/drama/search
Disallow: /forum/
Disallow: /new_subject
Disallow: /service/iframe
Disallow: /j/
Disallow: /link2/
Disallow: /recommend/
Disallow: /doubanapp/card
Disallow: /update/topic/
Allow: /ads.txt
Sitemap: https://www.douban.com/sitemap_index.xml
Sitemap: https://www.douban.com/sitemap_updated_index.xml
# Crawl-delay: 5
User-agent: Wandoujia Spider //豌豆荚的爬虫
Disallow: /
User-agent: Mediapartners-Google //谷歌的一种爬虫
Disallow: /subject_search
Disallow: /amazon_search
Disallow: /search
Disallow: /group/search
Disallow: /event/search
Disallow: /celebrities/search
Disallow: /location/drama/search
Disallow: /j/
Allow和Disallow,Allow代表可以被访问,Disallow代表禁止被访问
这里说一下HTML的相关问题
我们知道网页html组成成分是对外开放的,比如360浏览器,右键审查元素就能够看到html源代码,不过css和js等等相关引用是看不到的,所以爬虫能够爬取的文字图片也是html代码中的,只不过运用python语言的一些库以后可以实现一些单个别的骚操作
像前面的代码我们爬一次就是全部的html,我不需要那么多,我只要其中一个选择器标签中的就可以了,比如一个小说 论文 电影,他都是放在一个div/img/a/li…里的,其他的就在其他标签里
BeautifulSoup库的解析和提取
由于BeautifulSoup不是Python标准库,在使用之前我们需要进行单独的安装。如果你是在自己Windows环境下运行,需要在命令提示符cmd内运行代码:pip install bs4
import requests
from bs4 import BeautifulSoup
#引入BS库
res = requests.get('url')
html = res.text
soup = BeautifulSoup(html,'html.parser') #把网页解析为BeautifulSoup对象
代码中BeautifulSoup()括号里是(要解析的文本,解析器)
解析文本必须是字符串类型的值或变量!!!解析器这里用的python内置库:'html.parser’相对简单还有’lxml’等等
soup = BeautifulSoup(res.text,'html.parser')
item = soup.find('div')#提取首个div
item = soup.find_all('div')#提取所有div
#解析后就可以打印出你想要的纯文字了
print(item.text)
下面是实操⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇简单的爬个电影⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇代码里有解析
import requests
# 引用requests库
from bs4 import BeautifulSoup
# 引用BeautifulSoup库
headers={'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}
# 定义请求头
res_movies = requests.get('https://movie.douban.com/chart',headers=headers)
# 获取数据,传入参数,第一个是url,第二个是请求头
bs_movies = BeautifulSoup(res_movies.text,'html.parser')
# 解析数据
tag_name = bs_movies.find_all('div', class_='pl2')
# 查找包含电影名和电影详情URL的<div>标签,这里<a>标签没有明显的属性,我们找到了它的上一级标签
tag_p = bs_movies.find_all('p',class_='pl')
# 查找包含电影基本信息的<p>标签
tag_div = bs_movies.find_all('div', class_='star clearfix')
# 查找包含电影评分信息的<div>标签
list_all = []
# 创建一个空列表,用于存储信息
for x in range(len(tag_name)):
# 启动一个循环,次数等于电影名的数量
list_movie = [tag_name[x].find('a').text.replace(' ', '').replace('\n', ''),tag_name[x].find('a')['href'],tag_p[x].text.replace(' ', '').replace('\n', ''),tag_div[x].text.replace(' ', '').replace('\n', '')]
# 提取信息,封装为列表。
list_all.append(list_movie)
# 将信息添加进list_all
print(list_all)
# 打印
运行结果为
D:\Python\python\python.exe D:/Python/study/lianxi.py
[['无依之地/游牧人生(台)/浪迹天地(港)', 'https://movie.douban.com/subject/30458949/', '2020-09-11(威尼斯电影节)/2021-01-29(美国)/2021-02-19(美国网络)/弗兰西斯·麦克多蒙德/大卫·斯特雷泽恩/德里克·贾尼斯/泰·斯特雷泽恩/卡特·克利福德/彼得·斯皮尔斯/盖伊·德福雷斯特/帕特里夏·格里尔/琳达·梅/安吉拉·雷耶斯...', '8.4(48666人评价)'], ['一秒钟/OneSecond', 'https://movie.douban.com/subject/30257787/', '2020-11-27(中国大陆)/张译/刘浩存/范伟/余皑磊/张邵勃/李延/于洋/刘云龙/常海军/曹瑞/唐孜悦/李晓川/于滨/中国大陆/张艺谋/104分钟/剧情/张艺谋YimouZhang/邹静之JingzhiZou/汉语普通话', '7.8(186041人评价)'], ['穷途鼠的奶酪梦/爱在末路之境(港/台)/优柔有情人', 'https://movie.douban.com/subject/30443686/', '2020-09-11(日本)/大仓忠义/成田凌/吉田志织/咲妃美悠/入江甚仪/小柳友/岩濑亮/国广富之/中村久美/佐藤穗奈美/日本/www.phantom-film.com/kyuso//行定勋/131分钟/穷途鼠的奶酪梦/剧情/同性/堀泉杏AnneHoriizumi/水城雪可奈...', '7.6(13635人评价)'], ['女人的碎片/心碎的女人(港)/女人碎片(台)', 'https://movie.douban.com/subject/34869387/', '2020-09-05(威尼斯电影节)/2021-01-07(美国网络)/凡妮莎·柯比/希亚·拉博夫/艾伦·伯斯汀/埃莱扎·施莱辛格/本·萨弗迪/莎拉·斯努克/莫莉·帕克/史蒂文·麦卡锡/蒂龙·本斯金/弗兰克·萧宾/哈里·斯坦德乔夫斯基/多梅尼克·迪罗萨...', '7.8(13812人评价)'], ['刻在你心底的名字/史诗般的同志电影/YourNameEngravedHerein', 'https://movie.douban.com/subject/33408026/', '2020-03-14(大阪亚洲电影节)/2020-09-30(中国台湾)/2020-12-23(中国台湾网络)/陈昊森/曾敬骅/邵奕玫/戴立忍/王识贤/法比欧/魏如萱/曲献平/杨杰宇/林晖闵/邱治澔/王彩桦/黄良/吴承洋/黎安/邱昊奇/林志儒/苏达...', '7.2(64249人评价)'], ['沐浴之王/BathBuddy', 'https://movie.douban.com/subject/34894753/', '2020-12-11(中国大陆)/彭昱畅/乔杉/卜冠今/苇青/金世佳/洪剑涛/房子斌/张本煜/黄垲翔/朱时茂/沈南/桑平/白客/柯达/刘循子墨/巴多/孔连顺/李建义/闫校文/王英鉴/郭纯/谢杨言木/中国大陆/易小星/103分钟...', '6.2(215265人评价)'], ['逃避虽可耻但有用新春特别篇/逃避可耻但有用加油人类!新春特别篇!!/Wemarriedasajob!', 'https://movie.douban.com/subject/35211578/', '2021-01-02(日本)/新垣结衣/星野源/大谷亮平/藤井隆/真野惠里菜/成田凌/古馆宽治/细田善彦/茂吕师冈/高桥瞳/宇梶刚士/富田靖子/古田新太/石田百合子/西田尚美/青木崇高/樱井海音/前野朋哉/富手麻妙/伊藤修子...', '8.4(18667人评价)'], ['前程似锦的女孩/花漾女子(台)/有前途的年轻女子', 'https://movie.douban.com/subject/30450313/', '2020-01-25(圣丹斯电影节)/2020-12-25(美国)/凯瑞·穆里根/博·伯翰/爱丽森·布里/拉弗恩·考克斯/克兰西·布朗/詹妮佛·库里奇/克里斯托夫·梅兹-普莱瑟/莫莉·香侬/斯利姆·克什里/山姆·理查森/斯蒂夫·蒙罗埃/亚当·布罗迪...', '7.5(17223人评价)'], ['2020去死/死于2020/再也不见2020', 'https://movie.douban.com/subject/35275115/', '2020-12-27(美国网络)/塞缪尔·杰克逊/休·格兰特/丽莎·库卓/库梅尔·南贾尼/崔茜·尤玛/萨姆森·卡约/莱斯莉·琼斯/戴安·摩根/克里斯汀·米利欧缇/乔·基瑞/劳伦斯·菲什伯恩/莉莉·沙利文/查理·布鲁克/美国/阿尔·坎贝尔...', '7.2(13744人评价)'], ['玫瑰岛的不可思议的历史/玫瑰岛/RoseIsland', 'https://movie.douban.com/subject/34982759/', '2020-12-09(意大利网络)/埃利奥·杰曼诺/莱昂纳多·利迪/马蒂尔达·德·安杰利斯/汤姆·拉斯齐哈/卢卡·津加雷蒂/法布里齐奥·本蒂沃利奥/弗朗索瓦·克鲁塞/布鲁诺·格里/阿斯卡尼奥·巴尔博/法布里齐奥·隆吉奥内/马尔科·潘克拉齐...', '8.0(8839人评价)']]
Process finished with exit code 0