爬虫对于数据爬取具有重要意义,因此作者通过一些资料自学爬虫这一技术。
首先,使用爬虫要调用第三方库,requsts,beautiful soup等,因此要先用pycharm下载pip,具体方法为在pycharm的终端中输入pip install request,当终端中出现“Successfully install requests”则表明安装成功
将对豆瓣电影TOP250的电影名进行爬取,首先调用requests
import requests
然后使用request.get函数发送HTTP GET请求,它会向指定的URL发送获取页面的请求,用于获取资源,但此刻若我们将其赋值给一个变量,并输出该变量会出现什么呢?
import requests
respond=requests.get("https://movie.douban.com/top250")
print(respond)
他会出现一个数字418,这个数字为HTTP响应状态码,
418是一个非标准的HTTP状态码,被定义为"I’m a teapot"(我是一个茶壶)。这个状态码源自1998年的一个愚人节笑话,被写入了RFC 2324,Hyper Text Coffee Pot Control Protocol(超文本咖啡壶控制协议)。有些网站可能会使用这个状态码作为反爬虫策略的一部分。当服务器返回418状态码时,可能是因为服务器认为你的请求是一个爬虫,而不是一个正常的用户请求,那么如何解决这个问题呢?我们需要修改我们的请求头,使我们看起来是一个正常用户,通过设置User-Agent为一个浏览器的User-Agent,这是就需要我们去浏览器上面“copy”一下。打开任意一个浏览器,鼠标右键点击检查,然后点击网络,刷新一下网页任意点开一个,查看一下其User-Agent将其复制下来,在代码中创建一个headers的字典输入刚刚在浏览器中复制的User-Agent并将其加入requests函数中,此时再次输出,结果为多少呢?
import requests
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}
print(type(headers))
respond=requests.get(f"https://movie.douban.com/top250", headers=headers)
print(respond)
此时HTTP状态码为200, http状态码200的意思是HTTP请求请求成功。状态码200属于成功的范畴,表示服务器成功地处理了客户端的请求,并返回了请求的资源。具体来说,当客户端发送一个GET请求,请求某个资源(比如一个网页、图片或者其他文件),并且服务器成功找到并返回该资源时,服务器将返回状态码200。这意味着客户端的请求已经成功得到了满足,并且返回的响应中包含了请求的资源。此时将respond更改为respond.text,此处的.text作用为将获取的资源显示为带css格式的HTML
import requests
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}
respond=requests.get("https://movie.douban.com/top250", headers=headers)
html=respond.text
print(respond.text)
下一步为HTML页面的解析,此时将使用Beautiful soup从HTML中提取数据,它能够自动将输入的文档转换为Unicode编码,输出文档转化为UTF-8编码那么首先要安装beautiful库,需要在终端中输入“pip install beautifu requests”,即可,输入from bs4 import Beautifulsoup 引入Beautiful soup,然后使用parser对HTML进行解析,
import requests
from bs4 import BeautifulSoup
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}
for start_num in range(0,250,25):
respond=requests.get(f"https://movie.douban.com/top250?start={start_num}",headers=headers)
html = respond.text
soup = BeautifulSoup(html,"html.parser")
为筛选出HTML中的我们需要的元素要引入函数findall函数,此时我们要观察我们要筛选的元素有什么特征,
通过上面的图大家可以明显看到电影名称前都为spand ‘class’=‘title’,因此我们以此为参数对其进行爬取,此处使用attrs对‘clss’:‘title进行修饰’,结合findall即可对我们所需要的电影名称进行爬取,用string将其转为字符串然后使用for循环对其进行遍历
import requests
from bs4 import BeautifulSoup
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}
respond=requests.get(f"https://movie.douban.com/top250", headers=headers)
html=respond.text
soup = BeautifulSoup(html,"html.parser")
all_titles = soup.findAll("span",attrs={"class":"title"})
for title in all_titles:
title_string=title.string
print(title_string)
但此时输出的结果为
可以看到结果中有许多东西是我们不需要的,仔细观察可以看到 我们需要的电影名后都有一个/因此我们可以运用一个if将我们不需要的元素去掉
import requests
from bs4 import BeautifulSoup
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}
respond=requests.get(f"https://movie.douban.com/top250", headers=headers)
html=respond.text
soup = BeautifulSoup(html,"html.parser")
all_titles = soup.findAll("span",attrs={"class":"title"})
for title in all_titles:
title_string=title.string
if "/" not in title_string:
print(title_string)
到这就结束了吗?欧服靠日note,运行结果我们发现结果仅仅只是第一页的电影名,因此我们需要另外的参数
仔细观察豆瓣网址上的start后面的数字会发现每向后前进一页这个数字就加25,因此我们可以使用for循环和格式化字符串实现对全部页的爬取
import requests
from bs4 import BeautifulSoup
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}
for start_num in range(0,250,25):
respond=requests.get(f"https://movie.douban.com/top250?start={start_num}",headers=headers)
html = respond.text
soup = BeautifulSoup(html,"html.parser")
all_titles = soup.findAll("span",attrs={"class":"title"})
for title in all_titles:
title_string=title.string
if "/" not in title_string:
print(title_string)