前言:
网络爬虫无疑会为我们生活带来便利,但是过度的恶意爬取也会造成服务器的负担,这里还是请诸位利用好这把爬虫双刃剑。
目录
一、话不多说,先看代码,随后详谈
1.代码如下:
(1)单个网页爬取
(2)多个网页
2.运行结果 (只是一部分)
二、思路流程
1.正所谓巧妇难为无米之炊,我们要爬取信息得要源代码才行。可以用requests解决。
2.分析源代码,找到包含信息的标签,用beautifulsoup遍历找到。
3.利用beautifulsoup通过标签名字和属性遍历标签,查找到信息。
4.观察网址信息,制作出爬取多个网页的循环,比如说网址的后半段的某些数字的间隔是有规律的,如下所示
二、代码解释
1.代码库的解释
2.代码段的解释
(1)requests代码段的解释
(2)beautifulsoup代码段的解释
(3)整个代码段的解释
三、总结
一、话不多说,先看代码,随后详谈
1.代码如下:
(1)单个网页爬取
import requests
from bs4 import BeautifulSoup
kv={'user-agent':'Mozilla/5.0'}
r=requests.get('https://movie.douban.com/top250',headers=kv)
if (r.status_code==200):
source=r.text
soup = BeautifulSoup(source,'html.parser')
items=soup.find_all('div','item')
for i in items:
for j in range(len(i.find_all('span','title'))):
print(i.find_all('span','title')[j].string,end='')
print(i.find_all('span','other')[0].string)
print(i.find_all('p')[0].text.replace('\n','').replace(' ',''))
if(len(i.find_all('span','inq'))!=0):
print('评语:'+i.find_all('span','inq')[0].string)
print('评分:'+i.find_all(property="v:average")[0].string)
print("\n")
else:
print("哦豁~目标网站不给予响应")
(2)多个网页
import requests
from bs4 import BeautifulSoup
kv={'user-agent':'Mozilla/5.0'}
page=0
while (page<=250):
r=requests.get('https://movie.douban.com/top250?start='+str(page)+'&filter=',headers=kv)
page=page+25
if (r.status_code==200):
source=r.text
soup = BeautifulSoup(source,'html.parser')
items=soup.find_all('div','item')
for i in items:
for j in range(len(i.find_all('span','title'))):
print(i.find_all('span','title')[j].string,end='')
print(i.find_all('span','other')[0].string)
print(i.find_all('p')[0].text.replace('\n','').replace(' ',''))
if(len(i.find_all('span','inq'))!=0):
print('评语:'+i.find_all('span','inq')[0].string)
print('评分:'+i.find_all(property="v:average")[0].string)
print("\n")
else:
print("哦豁~目标网站不给予响应")
print('OVER~')
2.运行结果 (只是一部分)
二、思路流程
1.正所谓巧妇难为无米之炊,我们要爬取信息得要源代码才行。可以用requests解决。
2.分析源代码,找到包含信息的标签,用beautifulsoup遍历找到。
比如我们此次要爬取的电影都在items标签中,所有的电影名字都在title标签中,导演在p标签中等等,都是需要我们需要留心的。
3.利用beautifulsoup通过标签名字和属性遍历标签,查找到信息。
这里用到了beautifulsoup的find_all利用标签名字和属性遍历,标签的.string和.text属性进行字符提取输出。这里的string和text有所不同,string只能读取含有一个字标签的标签字符,而text可以读取含有多个字标签的所有字符。
4.观察网址信息,制作出爬取多个网页的循环,比如说网址的后半段的某些数字的间隔是有规律的,如下所示:
http://www.gugugu.com/top250?start=0&filter=
http://www.gugugu.com/top250?start=25&filter=
http://www.gugugu.com/top250?start=50&filter=
二、代码解释
1.代码库的解释
代码所需要的是reuqests和beautifulsoup的库,request的功能是访问网站并返回响应信息和网站的源代码,而beautifulsoup的功能是将源代码规范化以便查找其中的对应的信息。简单来说就是我们爬取到信息就好比要喝一碗汤,喝到汤就需要原料并且将其烹饪,requests为我们提供原料,beautifulsoup为我们烹饪,在烹饪后的美味汤中我们得以取到有价值的信息。
2.代码段的解释
(1)requests代码段的解释
#引入库
import requests
from bs4 import BeautifulSoup
#首先我们要进行伪造,将user-agent改成浏览器的,很多网站对python默认的user-agent很敏感,不改是大概率行不通的
#要是还行不通大家就改一下一下requests的其他post属性吧
kv={'user-agent':'Mozilla/5.0'}
#开始请求响应,并将响应的信息赋予给r
r=requests.get('https://movie.douban.com/top250',headers=kv)
#如果响应为200,便证明我们的响应成功,要是其他数字,那就自求多福咯~有兴趣的伙伴可以去网上查HTTP协议,里面有关于响应代码的详解
if (r.status_code==200):
#下面不必看,我稍后在解释!下面不必看,我稍后在解释!下面不必看,我稍后在解释!
# source=r.text
# soup = BeautifulSoup(source,'html.parser')
# items=soup.find_all('div','item')
# for i in items:
# for j in range(len(i.find_all('span','title'))):
# print(i.find_all('span','title')[j].string,end='')
# print(i.find_all('span','other')[0].string)
# print(i.find_all('p')[0].text)
# print('评语:'+i.find_all('span','inq')[0].string)
# print('评分:'+i.find_all(property="v:average")[0].string)
# print("\n")
#上面不必看,我稍后在解释!上面不必看,我稍后在解释!上面不必看,我稍后在解释!
else:#其他响应表明服务器可能有些不太乐意回应你
print("哦豁~目标网站不给予响应")
(2)beautifulsoup代码段的解释
#import requests
#from bs4 import BeautifulSoup
#kv={'user-agent':'Mozilla/5.0'}
#r=requests.get('https://movie.douban.com/top250',headers=kv)
#现在咱们介绍响应成功的情况
if (r.status_code==200):
#既然响应成功,就说明r已经得到了响应的信息,这里我们将信息中的源代码(r.text)赋予给source,以它为原料进行煲汤
source=r.text
#将源代码依照html.parser方法进行规格化
soup = BeautifulSoup(source,'html.parser')
#用find_all方法到信息所在标签,并以列表形式返回。
#这里的items包含着当前网页的电影项。
items=soup.find_all('div','item')
#用i遍历items中每一项电影
for i in items:
#电影的标题
for j in range(len(i.find_all('span','title'))):
print(i.find_all('span','title')[j].string,end='')
#电影的其他信息
print(i.find_all('span','other')[0].string)
#text不管标签中有多少子标签都会输出全部字符
#但是string在包含有多个标签的时候会不知所措,返回空值
print(i.find_all('p')[0].text)
#电影的引言
if(len(i.find_all('span','inq'))!=0):#防止有的电影没有引言
print('评语:'+i.find_all('span','inq')[0].string)
#电影的评分
print('评分:'+i.find_all(property="v:average")[0].string)
print("\n")
#else:
print("哦豁~目标网站不给予响应")
(3)整个代码段的解释
import requests
from bs4 import BeautifulSoup
#改变请求代理为浏览器。
kv={'user-agent':'Mozilla/5.0'}
page=0#网页起始页数
while (page<=250):#遍历多个网页
r=requests.get('https://movie.douban.com/top250?start='+str(page)+'&filter=',headers=kv)
page=page+25#以25为页面跨度
if (r.status_code==200):
source=r.text
soup = BeautifulSoup(source,'html.parser')#将r.text进行html规格化以便遍历
#开始遍历所有电影
items=soup.find_all('div','item')
#在每一个电影中搜查信息
for i in items:
for j in range(len(i.find_all('span','title'))):
print(i.find_all('span','title')[j].string,end='')
print(i.find_all('span','other')[0].string)
print(i.find_all('p')[0].text)
if(len(i.find_all('span','inq'))!=0):#电影没引言就跳过
print('评语:'+i.find_all('span','inq')[0].string)
print('评分:'+i.find_all(property="v:average")[0].string)
print("\n")
else:
print("哦豁~目标网站不给予响应")
print('OVER~')
三、总结
爬多了也会对服务器造成负担的,大家实验一下就好,不宜多爬,文章写的啰嗦了,而且代码的输出不够美观,还请各位就一笑而过吧,有错误的话怼我就成~