大一数据科学与大数据技术专业自学爬虫

爬虫对于数据爬取具有重要意义,因此作者通过一些资料自学爬虫这一技术。

首先,使用爬虫要调用第三方库,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)

  • 35
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值