from bs4 import BeautifulSoup #网页解析,获取数据
import sys #正则表达式,进行文字匹配
import re
import urllib.request,urllib.error #指定url,获取网页数据
import xlwt #使用表格
import sqlite3
import lxml
以上是引用的库,引用库的方法很简单,直接上图:

上面第一步算有了,下面分模块来,步骤算第二步来:
这个放在开头
1 def main():
2 baseurl ="https://movie.douban.com/top250?start="
3 datalist = getData(baseurl)
4 savepath=(\'douban.xls\')
5 saveData(datalist,savepath)
这个放在末尾
1 if __name__ == \'__main__\':
2 main()
不难看出这是主函数,里面的话是对子函数的调用,下面是第三个步骤:子函数的代码
对网页正则表达提取(放在主函数的后面就可以)
1 findLink = re.compile(r\'<a href="(.*?)">\') #创建正则表达式对象,表示规则(字符串的模式)
2 #影片图片
3 findImg = re.compile(r\'<img.*src="(.*?)" width="100"/>\',re.S)#re.S取消换行符
4 #影片片面
5 findtitle= re.compile(r\'<span class="title">(.*?)</span>\')
6 #影片评分
7 fileRating = re.compile(r\'<span class="rating_num" property="v:average">(.*?)</span>\')
8 #找到评价的人数
9 findJudge = re.compile(r\'<span>(\d*)人评价</span>\')
10 #找到概识
11 findInq =re.compile(r\'<span class="inq">(.*?)</span>\')
12 #找到影片的相关内容
13 findBd = re.compile(r\'<p class="">(.*?)</p>\',re.S)
爬数据核心函数
1 def getData(baseurl):
2 datalist=[]
3 for i in range(0,10):#调用获取页面的函数10次
4 url = baseurl + str(i*25)
5 html = askURl(url)
6 #逐一解析
7 soup = BeautifulSoup(html,"html.parser")
8 for item in soup.find_all(\'div\',class_="item"):
9 #print(item)
10 data=[]
11 item = str(item)
12
13 link = re.findall(findLink,item)[0] #re库用来通过正则表达式查找指定的字符串
14 data.append(link)
15 titles =re.findall(findtitle,item)
16 if(len(titles)==2):
17 ctitle=titles[0].replace(\'\xa0\',"")
18 data.append(ctitle)#添加中文名
19 otitle = titles[1].replace("\xa0/\xa0Perfume:","")
20 data.append(otitle)#添加外国名
21 else:
22 data.append(titles[0])
23 data.append(\' \')#外国名字留空
24
25 imgSrc = re.findall(findImg,item)[0]
26 data.append(imgSrc)
27
28 rating=re.findall(fileRating,item)[0]
29 data.append(rating)
30
31 judgenum = re.findall(findJudge,item)[0]
32 data.append(judgenum)
33
34 inq=re.findall(findInq,item)
35 if len(inq) != 0:
36 inq =inq[0].replace(".","")
37 data.append(inq)
38 else:
39 data.append(" ")
40 bd=re.findall(findBd,item)[0]
41 bd=re.sub(\'<br(\s+)?/>(\s+)?\'," ",bd) #去掉<br/>
42 bd =re.sub(\'\xa0\'," ",bd)
43 data.append(bd.strip()) #去掉前后的空格
44
45 datalist.append(data) #把处理好的一部电影信息放入datalist
46
47 return datalist
获取指定网页内容
1 def askURl(url):
2
3 head = {
4 "User-Agent": "Mozilla / 5.0(Windows NT 10.0;WOW64) Apple"
5 +"WebKit / 537.36(KHTML, likeGecko) Chrome / 78.0.3904.108 Safari / 537.36"
6 }
7 #告诉豆瓣我们是浏览器我们可以接受什么水平的内容
8 request = urllib.request.Request(url,headers=head)
9 html=""
10 try:
11 response = urllib.request.urlopen(request)
12 html = response.read().decode("utf-8")
13 # print(html)
14 except urllib.error.URLError as e:
15 if hasattr(e,"code"):
16 print(e.code)
17 if hasattr(e,"reason"):
18 print(e.reason)
19 return html
将爬下来的数据保存到表格中
1 ef saveData(datalist,savepath):
2 print("保存中。。。")
3 book = xlwt.Workbook(encoding="utf-8",style_compression=0) # 创建workbook对象
4 sheet = book.add_sheet(\'douban\',cell_overwrite_ok=True) #创建工作表 cell_overwrite_ok表示直接覆盖
5 col = ("电影详情链接","影片中文网","影片外国名","图片链接","评分","评价数","概况","相关信息")
6 for i in range(0,8):
7 sheet.write(0,i,col[i])
8 for i in range(0,250):
9 print("第%d条" %(i+1))
10 data = datalist[i]
11 for j in range(0,8):
12 sheet.write(i+1,j,data[j])
13
14 book.save(savepath)
以上就是整个爬数据的整个程序,这仅仅是一个非常简单的爬取,如果想要爬更难的网页需要实时分析
整个程序代码
1 from bs4 import BeautifulSoup #网页解析,获取数据
2 import sys #正则表达式,进行文字匹配
3 import re
4 import urllib.request,urllib.error #指定url,获取网页数据
5 import xlwt #使用表格
6 import sqlite3
7 import lxml
8
9 def main():
10 baseurl ="https://movie.douban.com/top250?start="
11 datalist = getData(baseurl)
12 savepath=(\'douban.xls\')
13 saveData(datalist,savepath)
14 #影片播放链接
15 findLink = re.compile(r\'<a href="(.*?)">\') #创建正则表达式对象,表示规则(字符串的模式)
16 #影片图片
17 findImg = re.compile(r\'<img.*src="(.*?)" width="100"/>\',re.S)#re.S取消换行符
18 #影片片面
19 findtitle= re.compile(r\'<span class="title">(.*?)</span>\')
20 #影片评分
21 fileRating = re.compile(r\'<span class="rating_num" property="v:average">(.*?)</span>\')
22 #找到评价的人数
23 findJudge = re.compile(r\'<span>(\d*)人评价</span>\')
24 #找到概识
25 findInq =re.compile(r\'<span class="inq">(.*?)</span>\')
26 #找到影片的相关内容
27 findBd = re.compile(r\'<p class="">(.*?)</p>\',re.S)
28
29 def getData(baseurl):
30 datalist=[]
31 for i in range(0,10):#调用获取页面的函数10次
32 url = baseurl + str(i*25)
33 html = askURl(url)
34 #逐一解析
35 soup = BeautifulSoup(html,"html.parser")
36 for item in soup.find_all(\'div\',class_="item"):
37 #print(item)
38 data=[]
39 item = str(item)
40
41 link = re.findall(findLink,item)[0] #re库用来通过正则表达式查找指定的字符串
42 data.append(link)
43 titles =re.findall(findtitle,item)
44 if(len(titles)==2):
45 ctitle=titles[0].replace(\'\xa0\',"")
46 data.append(ctitle)#添加中文名
47 otitle = titles[1].replace("\xa0/\xa0Perfume:","")
48 data.append(otitle)#添加外国名
49 else:
50 data.append(titles[0])
51 data.append(\' \')#外国名字留空
52
53 imgSrc = re.findall(findImg,item)[0]
54 data.append(imgSrc)
55
56 rating=re.findall(fileRating,item)[0]
57 data.append(rating)
58
59 judgenum = re.findall(findJudge,item)[0]
60 data.append(judgenum)
61
62 inq=re.findall(findInq,item)
63 if len(inq) != 0:
64 inq =inq[0].replace(".","")
65 data.append(inq)
66 else:
67 data.append(" ")
68 bd=re.findall(findBd,item)[0]
69 bd=re.sub(\'<br(\s+)?/>(\s+)?\'," ",bd) #去掉<br/>
70 bd =re.sub(\'\xa0\'," ",bd)
71 data.append(bd.strip()) #去掉前后的空格
72
73 datalist.append(data) #把处理好的一部电影信息放入datalist
74
75 return datalist
76
77 #得到指定一个url的网页内容
78 def askURl(url):
79
80 head = {
81 "User-Agent": "Mozilla / 5.0(Windows NT 10.0;WOW64) Apple"
82 +"WebKit / 537.36(KHTML, likeGecko) Chrome / 78.0.3904.108 Safari / 537.36"
83 }
84 #告诉豆瓣我们是浏览器我们可以接受什么水平的内容
85 request = urllib.request.Request(url,headers=head)
86 html=""
87 try:
88 response = urllib.request.urlopen(request)
89 html = response.read().decode("utf-8")
90 # print(html)
91 except urllib.error.URLError as e:
92 if hasattr(e,"code"):
93 print(e.code)
94 if hasattr(e,"reason"):
95 print(e.reason)
96 return html
97
98 def saveData(datalist,savepath):
99 print("保存中。。。")
100 book = xlwt.Workbook(encoding="utf-8",style_compression=0) # 创建workbook对象
101 sheet = book.add_sheet(\'douban\',cell_overwrite_ok=True) #创建工作表 cell_overwrite_ok表示直接覆盖
102 col = ("电影详情链接","影片中文网","影片外国名","图片链接","评分","评价数","概况","相关信息")
103 for i in range(0,8):
104 sheet.write(0,i,col[i])
105 for i in range(0,250):
106 print("第%d条" %(i+1))
107 data = datalist[i]
108 for j in range(0,8):
109 sheet.write(i+1,j,data[j])
110
111 book.save(savepath)
112
113 if __name__ == \'__main__\':
114 main()
如果有什么问题,可以直接留言,再次欢迎光临!!!!