py爬虫
一.环境的搭建
1.编译器
我选择的是vscode,因为之前的语言都是用的它,比较习惯,当然也可用PyCharm,用学生的身份可以免费用,也可以用社区版。
vscode
PyCharm
2.库的安装
我使用的是vscode,因此选择py自带的pip安装,通过cmd,如图所示
输入指令pip install 库名进行安装
二.获取网页数据
1.静态数据的获取
3.url
baseurl = "https://movie.douban.com/top250?start="
2.伪装成浏览器
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36'}
三.从爬取的html文档中获取需要的数据
观察给定html文档中的数据,通过正则表达式获取相应的数据,然后将对应的数据进行处理,该删除的删除,该添加的添加
四.将爬取的文件保存到excel表格中
利用xlwt库进行对excel的操作
五.案例—爬取豆瓣Top250的电影信息,并将其保存到excel中
1.流程图
2.源代码
from bs4 import BeautifulSoup
import requests
import re
import xlwt
def main():
baseurl = "https://movie.douban.com/top250?start="
# 1.爬取网页
datalist = getData(baseurl)
savepath = "豆瓣电影Top250.xls"
# 3.保存数据
saveData(datalist, savepath)
# 爬取网页
def getData(baseurl):
datalist = []
for i in range(0, 10): # 调用获取页面信息的函数10次
url = baseurl + str(i*25)
html = askURL(url)
# 2.分析数据
soup = BeautifulSoup(html, "html.parser")
olTag = soup.find('ol', class_='grid_view')
details = olTag.find_all('li')
for detail in details:
movieInfo = []
movieRank = detail.find('em').text # 电影排名
movieName = '《' + \
detail.find('span', class_='title').text + '》' # 电影名称
movieScore = detail.find(
'span', class_='rating_num').text + '分' # 电影评分
movieCommentNum = detail.find(
text=re.compile('\\d+人评价')).string # 评价人数
if detail.find('span', class_='inq'):
movieReview = '"' + \
detail.find('span', class_='inq').text + '"' # 电影短评
movieP = detail.find('p').text
movieP1 = movieP.split('\n')[1]
movieP2 = movieP.split('\n')[2]
movieDirector = movieP1.split('\xa0')[0].strip()[4:] # 导演
movieYear = re.findall(r'\d{4}', movieP2)[0] # 上映年份
movieCountry = movieP2.split('\xa0/\xa0')[-2] # 制片国家
movieType = movieP2.split('\xa0/\xa0')[-1].strip() # 电影类型
# 将爬取的信息存入列表
movieInfo.append(movieRank)
movieInfo.append(movieName)
movieInfo.append(movieDirector)
movieInfo.append(movieYear)
movieInfo.append(movieCountry)
movieInfo.append(movieType)
movieInfo.append(movieScore)
movieInfo.append(movieCommentNum)
movieInfo.append(movieReview)
datalist.append(movieInfo) # 信息放进去
print(datalist)
return datalist
# 得到指定url的网页内容
def askURL(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36'}
response = requests.get(url=url, headers=headers)
response.raise_for_status()
response.encoding = "utf-8"
# fileName = './douban.html' # 输出到文件
# with open(fileName, 'w', encoding='utf-8') as fp:
# fp.write(page_text)
return response.text
def saveData(datalist, savepath):
book = xlwt.Workbook(encoding="utf-8")
sheet = book.add_sheet('豆瓣电影Top250')
col = ("电影排名", "电影名称", "导演", "上映年份", "制片国家",
"电影类型", "电影评分", "评价人数", "电影短评")
for i in range(0, 9):
sheet.write(0, i, col[i])
for i in range(0, 250):
print("第%d条" % i)
data = datalist[i]
for j in range(0, 9):
sheet.write(i+1, j, data[j])
book.save('豆瓣Top250.xls')
if __name__ == "__main__":
main()