Python爬虫信息技术实践之四抓取数据及数据解析
1.分析
针对所爬去的Url进行分析:
爬取的网址是:https://movie.douban.com/top250?start=0&filter=
分析网址'?'符号后的参数,第一个参数'start=0',这个代表页数,‘=0’时代表第一页,‘=25’代表第二页,以此类推。
1.1页面分析
明确要爬取的元素 :排名、名字、导演、评语、评分
1.2 页面代码分析
2.网站信息爬取
2.1 获取每部分电影信息
def get_html(web_url):
header = {
"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)
AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"}
html = requests.get(url=web_url,headers= header).text
soup = BeautifulSoup(html,'lxml')
data = soup.find('ol').find_all('li') #截取需要的内容
return data
代码说明】
requests.get()函数,会根据参数中url的链接,返回response对象
.text会将response对象转换成str类型
find_all()函数,会将html文本中的ol标签下的每一个li标签中的内容筛选出来
2.2 筛选信息保存进入文本
def get_info(all_move):
f = open("./douban.txt", "a",encoding='UTF-8')
for info in all_move:
#排名
nums = info.find('em')
num = nums.get_text()
#名字
names = info.find("span") # 名字比较简单 直接获取第一个span就是
name = names.get_text()
#导演
charactors = info.find("p") # 这段信息中有太多非法符号你需要替换掉
charactor = charactors.get_text().replace(" ", "").replace("\n", "") # 使信息排列规律
charactor = charactor.replace("\xa0", "").replace("\xee", "").replace("\xf6", "").replace("\u0161", "").replace(
"\xf4", "").replace("\xfb", "").replace("\u2027", "").replace("\xe5", "")
#评语
remarks = info.find_all("span", {"class": "inq"})
if remarks: # 这个判断是因为有的电影没有评语,你需要做判断
remark = remarks[0].get_text().replace("\u22ef", "")
else:
remark = "此影片没有评价"
print(remarks)
#评分
scores = info.find_all("span", {"class": "rating_num"})
score = scores[0].get_text()
f.write(num + '、')
f.write(name + "\n")
f.write(charactor + "\n")
f.write(remark + "\n")
# f.write(score)
f.write("\n\n")
f.close() # 记得关闭文件
注意爬取元素的时候,会有非法符号(因为这些符号的存在,会影响你写入文本中),所以需要将符号用replace函数替换.
【Tips】注意写数据时将格式改为“UTF-8”,不然所写信息为乱码
常见状态码
200 - 服务器成功返回网页,客户端请求已成功。
302 - 对象临时移动。服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
304 - 属于重定向。自上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。
401 - 未授权。请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
404 - 未找到。服务器找不到请求的网页。
503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
-----------------------------------
Python爬虫入门教程:豆瓣Top电影爬取
https://blog.51cto.com/u_15162069/2741239
全部代码如下:
#coding:utf-8
from bs4 import BeautifulSoup
import requests
import os
def get_html(web_url):
header = {
"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"}
html = requests.get(url=web_url,headers= header).text
soup = BeautifulSoup(html,'lxml')
data = soup.find('ol').find_all('li') #截取需要的内容
return data
def get_info(all_move):
f = open("./douban.txt", "a",encoding='UTF-8')
for info in all_move:
#排名
nums = info.find('em')
num = nums.get_text()
#名字
names = info.find("span") # 名字比较简单 直接获取第一个span就是
name = names.get_text()
#导演
charactors = info.find("p") # 这段信息中有太多非法符号你需要替换掉
charactor = charactors.get_text().replace(" ", "").replace("\n", "") # 使信息排列规律
charactor = charactor.replace("\xa0", "").replace("\xee", "").replace("\xf6", "").replace("\u0161", "").replace(
"\xf4", "").replace("\xfb", "").replace("\u2027", "").replace("\xe5", "")
#评语
remarks = info.find_all("span", {"class": "inq"})
if remarks: # 这个判断是因为有的电影没有评语,你需要做判断
remark = remarks[0].get_text().replace("\u22ef", "")
else:
remark = "此影片没有评价"
print(remarks)
#评分
scores = info.find_all("span", {"class": "rating_num"})
score = scores[0].get_text()
f.write(num + '、')
f.write(name + "\n")
f.write(charactor + "\n")
f.write(remark + "\n")
# f.write(score)
f.write("\n\n")
f.close() # 记得关闭文件
if __name__ == "__main__":
File_Path = os.getcwd()[:-4] + 'Test\\' # 获取到当前文件的目录,并检查是否有report文件夹,如果不存在则自动新建report文件
if not os.path.exists(File_Path):
os.makedirs(File_Path)
page = 0 # 初始化页数,TOP一共有250部 每页25部
while page <= 225:
web_url = "https://movie.douban.com/top250?start=%s&filter=" % page
all_move = get_html(web_url) # 返回每一页的网页
get_info(all_move) # 匹配对应信息存入本地
page += 25
requests.get(url=url, headers=headers) 请求网页返回的是response对象
response.text: 获取网页文本数据
response.json: 获取网页json数据
这两个是用的最多的,当然还有其他的
效果图如下:
- 点赞
- 收藏
- 关注作者
评论(0)