1.引入相关模块
from bs4 import BeautifulSoup #网页解析,获取数据
import re #正则表达式,进行文字匹配
import urllib.request,urllib.error #制定 URL,获取网页数据
import xlwt #进行excel操作
2.爬虫分为三步:爬取网页 → 解析数据 → 保存数据
3.实现翻页
豆瓣TOP250网址:https://movie.douban.com/top250,获取的这个250个影片的信息分成10页,每页25个。观察发现第1页排名前25的网址为:https://movie.douban.com/top250?start=0&filter=,观察发现第2页排名前26-50的网址为:https://movie.douban.com/top250?start=25&filter=。并且,删掉“&filter=”后,对网页没有影响。
实现翻页:
for page in range(0,10):#获取网址,10页
url = "https://movie.douban.com/top250?start="+ str(i*25)
4.正则表达式
re.compile(r’字符串1(.*?)字符串2’)
字符串1和字符串2用来定位,输出()中的数据
findTitle = re.compile(r'<span class="title">(.*)</span>')
5.查找User-Agent
F12,或右键+审查元素
6.完整代码
下面代码,只要把User-Agent填好,就应该可以跑了。
#-*- coding = utf-8 -*-
from bs4 import BeautifulSoup #网页解析,获取数据
import re #正则表达式,进行文字匹配
import urllib.request,urllib.error #制定 URL,获取网页数据
import xlwt #进行excel操作
def main():
datalist = getData() #自定义函数,爬取网页,并解析
saveData(datalist) ##自定义函数,保存数据
#需要的数据的正则表达式
#正则表达式 re.compile(r'字符串1(.*?)字符串2')
#片名
findTitle = re.compile(r'<span class="title">(.*)</span>')
#地区,类型
findMassage = re.compile('p class="">.*\xa0/\xa0(.*)\xa0/\.*\xa0(.*?)\n.*</p>',re.S) #re.S 让换行符包含在字符中
# 1.爬取网页
def getData():
datalist = []
for i in range(0,10): #调用获取页面信息的函数,10次
url = "https://movie.douban.com/top250?start="+ str(i*25)
html = askURL(url) #保存获取到的网页源码
# 2.解析数据(逐一)
soup = BeautifulSoup(html,"html.parser")
for item in soup.find_all('div',class_="item"): #查找符合要求的字符串,形成列表
# print(item) #测试:查看电影item全部信息,可以观察一下内容,选择自己想要的数据
data = []
item=str(item)
title = re.findall(findTitle, item)[0]
data.append(title)
massage = re.findall(findMassage, item)[0][1]
data.append(massage)
datalist.append(data)
return datalist
# 得到指定一个URL的网页内容
def askURL(url):
#模拟浏览器头部信息,向豆瓣服务器发送消息
head = {
"User-Agent": "...(这里填写自己的User-Agent,如何查找看地第5点)"
} #"User-Agent":用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)
request = urllib.request.Request(url,headers=head)
html = ""
try:
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")
#print(html)
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
return html
# 3.保持数据
def saveData(datalist):
workbook = xlwt.Workbook(encoding="utf-8") # 创建workbook对象
worksheet = workbook.add_sheet('豆瓣电影 Top250') # 创建工作表
worksheet.write(0, 1, '影片片名')
worksheet.write(0, 2, '影片类型')
for i in range(len(datalist)):
worksheet.write(i+1, 0, i+1)
for j in range(len(datalist[0])):
worksheet.write(i+1,j+1,datalist[i][j])
workbook.save(".\\豆瓣电影Top250.xls") # 保存数据表
if __name__ == "__main__":
#调用函数
main()