一篇文章入门python爬虫(需要html,css基础)
代码演示
-
创建项目
-
首先安装requests包
pip install -i http://pypi.douban.com/simple/ requests
-
测试代码
# 1. 导入模块
import requests
# 2. 发送请求,获取响应
response = requests.get("http://books.toscrape.com/") # 这是一个用于测试的网络链接
# 3. 打印响应体
print(response)
# 打印响应码
print(response.status_code)
print(response.content.decode())
运行结果
- 爬虫练习
response.ok只要是响应码是可以的,响应可以通过,那么就响应成功,然后我们打印返回结果,response.text.
# 1. 导入模块
import requests
# 2. 发送请求,获取响应
response = requests.get("http://books.toscrape.com/") # 这是一个用于测试的网络链接
if response.ok:
print(response.text)
else:
print("请求失败")
运行结果
爬取豆瓣top250数据案例
案例演示网址https://movie.douban.com/top250
- 测试代码
# 1. 导入模块
import requests
# 2. 发送请求,获取响应
response = requests.get("https://movie.douban.com/top250") # 这是一个用于测试的网络链接
print(response.status_code)
运行结果
这个运行结果是418,意思是愚人节,表示网页发现了,访问这个网页的是程序,不是人类。
- 定义请求头
在网页部分点击F12,点击网络
刷新网页,可以看见很多发送的请求
点击其中的任意一个请求
找到user-agent
把这个请求头复制到代码中。
完整代码
# 1. 导入模块
import requests
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.69"
}
# 2. 发送请求,获取响应
response = requests.get("https://movie.douban.com/top250", headers = headers) # 这是一个用于测试的网络链接
print(response.status_code)
运行结果
-
BeautifulSoup库来解析网页源码
-
首先安装bs4包
pip install -i http://pypi.douban.com/simple/ bs4
如果上面命令安装失败,那么使用这个命令
python.exe -m pip install bs4 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
选择需要获取的标签的情况,比如我现在想要获取这个评分,然后可以看出来,它是spanB标签下的rating_num
属性
完整代码
import requests
from bs4 import BeautifulSoup
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.69"
}
# 2. 发送请求,获取响应
response = requests.get("https://movie.douban.com/top250", headers = headers) # 这是一个用于测试的网络链接
content = response.text
# 获取文本的树状结构
soup = BeautifulSoup(content,"html.parser")
# 获取评分集合
all_rating_nums = soup.findAll("span", attrs={"class", "rating_num"})
for rating_num in all_rating_nums:
print(rating_num)
运行结果,获取到了一页的评分情况
通过切片获取具体评分
import requests
from bs4 import BeautifulSoup
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.69"
}
# 2. 发送请求,获取响应
response = requests.get("https://movie.douban.com/top250", headers = headers) # 这是一个用于测试的网络链接
content = response.text
# 获取文本的树状结构
soup = BeautifulSoup(content,"html.parser")
# 获取评分集合
all_rating_nums = soup.findAll("span", attrs={"class", "rating_num"})
for rating_num in all_rating_nums:
print(rating_num.string)
运行结果
现在我想要获取每一部的与评分相结合的情况。
获取作品姓名代码
首先是观察作品名字的盒子信息,可以知道的是hd这个盒子下的,a标签中。
关键操作代码如下
all_titles = soup.findAll("div", attrs={"class", "hd"})
for title in all_titles:
all_links = title.findAll("span", attrs={"class", "title"})
for link in all_links:
print(link.string.split("/")[0])
运行结果
- 分页操纵获取全部
观察这个分页情况,还有页面情况,url情况,一共有10页,每页25个
我们换页之后的样子
直接用这个链接也可以的
https://movie.douban.com/top250?start=25
然后这个就知道怎么写了,通过一个循环不断的设置新的地址,然后爬取十次就可以了,然后完整代码如下。
import requests
from bs4 import BeautifulSoup
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.69"
}
for i in range(0, 251, 25):
url = "https://movie.douban.com/top250?start=" + str(i)
# 2. 发送请求,获取响应
response = requests.get(url, headers = headers) # 这是一个用于测试的网络链接
content = response.text
# 获取文本的树状结构
soup = BeautifulSoup(content,"html.parser")
# 获取评分集合
# all_rating_nums = soup.findAll("span", attrs={"class", "rating_num"})
# for rating_num in all_rating_nums:
# print(rating_num.string)
all_titles = soup.findAll("div", attrs={"class", "hd"})
for title in all_titles:
all_links = title.findAll("span", attrs={"class", "title"})
for link in all_links:
print(link.string.split("/")[0])
运行完毕,爬取成功