当前位置:   article > 正文

python 电影网站爬虫项目_python电影网站

python电影网站

首先,我们来看一下源码。

  1. from bs4 import BeautifulSoup #解析网页,获取数据
  2. import re #正则表达式,进行文字匹配
  3. import urllib.request,urllib.error #制定url,获取网页数据
  4. import xlwt #进行excel操作
  5. import sqlite3 #进行SQLite数据库操作
  6. def main():
  7. baseurl = "https://movie.douban.com/top250?start="
  8. #爬取网页
  9. datalist = getData(baseurl)
  10. #保存数据
  11. savepath = "豆瓣电影Top250.xls"
  12. saveData(datalist,savepath)
  13. dbpath = "douban250.db"
  14. saveData_db(datalist,dbpath)
  15. findLink = re.compile(r'<a href="(.*?)">') # compile创建正则表达式对象,表示规则(字符串模式)
  16. #封面图片
  17. findImgSrc = re.compile(r'<img.*src="(.*?)".*>',re.S) # re.S 忽略换行符
  18. #电影名称
  19. findTitle = re.compile(r'<span class="title">(.*)</span>')
  20. #评分
  21. findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
  22. #评价人数
  23. findJudge = re.compile(r'<span>(\d*)人评价</span>') # \d表示数字 * 多个
  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次,一次25条
  32. url = baseurl + str(i*25)
  33. html = askURL(url) # 保存获取到的网页源码
  34. # 2.逐一解析数据
  35. soup = BeautifulSoup(html,"html.parser") # html.parser网页解析器
  36. # find_all()是按照一定的标准,将符合要求的字符串一次性查找出来形成列表
  37. for item in soup.find_all('div',class_="item"): # class后的 _ 表示属性值
  38. #print(item)
  39. data = [] # 保存一部电影的所有信息
  40. item = str(item) # 将其转为字符串
  41. # 提取超链接 re库用来通过正则表达式找到指定的字符串 findLink是自定义的全局变量
  42. Link = re.findall(findLink,item)[0] # [0]第一个
  43. data.append(Link) # 将连接追加到列表中
  44. ImgSrc = re.findall(findImgSrc,item)[0]
  45. data.append(ImgSrc)
  46. Title = re.findall(findTitle,item) # 片名可能只有一个中文名没有外文名
  47. if len(Title)==2: # 判断有几个titles
  48. ctitle = Title[0] # 添加中文名
  49. data.append(ctitle)
  50. otitle = Title[1].replace("/","") # 去掉/
  51. data.append(otitle) # 添加外文名
  52. else:
  53. data.append(Title[0])
  54. data.append(' ') # 第二个留空
  55. Rating = re.findall(findRating,item)[0]
  56. data.append(Rating) # 添加评分
  57. Judge = re.findall(findJudge,item)[0]
  58. data.append(Judge) # 添加人数
  59. Inq = re.findall(findInq,item)
  60. if len(Inq) !=0: # 有概述
  61. Inq = Inq[0].replace("。","") # 替换。
  62. data.append(Inq)
  63. else: # 没有概述
  64. data.append(" ")
  65. Bd = re.findall(findBd,item)[0]
  66. # 将bd中的 <br(\s+)?/>(\s+)? 替换
  67. Bd = re.sub('<br(\s+)?/>(\s+)?'," ",Bd)
  68. data.append(Bd.strip()) # strip去掉前后空格
  69. datalist.append(data) #把处理好的一个电影信息存储到datalist中
  70. #解析网页
  71. return datalist
  72. #获取指定一个网页内容
  73. def askURL(url):
  74. head = {
  75. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.116 Safari/537.36"
  76. } #伪装成网页的形式,请求网页信息
  77. request = urllib.request.Request(url,headers=head)
  78. html = "" # 存放到html中
  79. try: # 防止出现意外
  80. response = urllib.request.urlopen(request)
  81. html = response.read().decode("utf-8") # 读取response
  82. #print(html)
  83. except urllib.error.URLError as e: # 捕获404 500 等浏览器错误
  84. if hasattr(e,"code"): #将其输出
  85. print(e.code)
  86. if hasattr(e,"reason"): # 输出没有捕获成功的原因
  87. print(e.reason)
  88. return html
  89. #保存数据
  90. def saveData(datalist,savepath):
  91. print("save....")
  92. book = xlwt.Workbook(encoding="utf-8",style_compression=0) # style_compression样式压缩效果
  93. sheet = book.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True) #cell_overwrite_ok单元格覆盖
  94. col = ("电影详情链接","封面链接","影片中文名","影片外国名","评分","评价数","概况","相关信息","") # 列属性
  95. for i in range(0,8): # 写列名
  96. sheet.write(0,i,col[i])
  97. for i in range(0,250):
  98. print("第%d条"%(i+1))
  99. data = datalist[i]
  100. for j in range(0,8):
  101. sheet.write(i+1,j,data[j]) #
  102. book.save('豆瓣电影Top250.xls')
  103. def saveData_db(datalist,dbpath):
  104. init_db(dbpath)
  105. conn = sqlite3.connect(dbpath)
  106. cur = conn.cursor() #获取游标。获取操作的数据库对象
  107. for data in datalist:
  108. for index in range(len(data)):
  109. if index == 4 or index == 5:
  110. continue
  111. data[index] = '"'+data[index]+'"'
  112. sql = '''
  113. insert into movie250 (
  114. info_link, pic_link,cname,ename,score,rated,introduction,info)
  115. values(%s) '''%",".join(data)
  116. cur.execute(sql)
  117. conn.commit()
  118. cur.close()
  119. conn.close()
  120. def init_db(dbpath):
  121. sql = '''
  122. create table movie250
  123. (
  124. id integer primary key autoincrement,
  125. info_link text,
  126. pic_link text,
  127. cname varchar,
  128. ename varchar,
  129. score numeric,
  130. rated numeric,
  131. introduction text,
  132. info text
  133. )
  134. '''
  135. conn = sqlite3.connect(dbpath) # 创建数据库
  136. cursor = conn.cursor() # 获取游标。获取操作的数据库对象
  137. cursor.execute(sql) #执行sql语句
  138. conn.commit() # 提交
  139. conn.close() #关闭数据库文件
  140. main()
  141. print("爬取完毕")

然后运行代码

  1. save....
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10. 9
  11. 10
  12. 11
  13. 12
  14. 13
  15. 14
  16. 15
  17. 16
  18. 17
  19. 18
  20. 19
  21. 20
  22. 21
  23. 22
  24. 23
  25. 24
  26. 25
  27. 26
  28. 27
  29. 28
  30. 29
  31. 30
  32. 31
  33. 32
  34. 33
  35. 34
  36. 35
  37. 36
  38. 37
  39. 38
  40. 39
  41. 40
  42. 41
  43. 42
  44. 43
  45. 44
  46. 45
  47. 46
  48. 47
  49. 48
  50. 49
  51. 50
  52. 51
  53. 52
  54. 53
  55. 54
  56. 55
  57. 56
  58. 57
  59. 58
  60. 59
  61. 60
  62. 61
  63. 62
  64. 63
  65. 64
  66. 65
  67. 66
  68. 67
  69. 68
  70. 69
  71. 70
  72. 71
  73. 72
  74. 73
  75. 74
  76. 75
  77. 76
  78. 77
  79. 78
  80. 79
  81. 80
  82. 81
  83. 82
  84. 83
  85. 84
  86. 85
  87. 86
  88. 87
  89. 88
  90. 89
  91. 90
  92. 91
  93. 92
  94. 93
  95. 94
  96. 95
  97. 96
  98. 97
  99. 98
  100. 99
  101. 100
  102. 101
  103. 102
  104. 103
  105. 104
  106. 105
  107. 106
  108. 107
  109. 108
  110. 109
  111. 110
  112. 111
  113. 112
  114. 113
  115. 114
  116. 115
  117. 116
  118. 117
  119. 118
  120. 119
  121. 120
  122. 121
  123. 122
  124. 123
  125. 124
  126. 125
  127. 126
  128. 127
  129. 128
  130. 129
  131. 130
  132. 131
  133. 132
  134. 133
  135. 134
  136. 135
  137. 136
  138. 137
  139. 138
  140. 139
  141. 140
  142. 141
  143. 142
  144. 143
  145. 144
  146. 145
  147. 146
  148. 147
  149. 148
  150. 149
  151. 150
  152. 151
  153. 152
  154. 153
  155. 154
  156. 155
  157. 156
  158. 157
  159. 158
  160. 159
  161. 160
  162. 161
  163. 162
  164. 163
  165. 164
  166. 165
  167. 166
  168. 167
  169. 168
  170. 169
  171. 170
  172. 171
  173. 172
  174. 173
  175. 174
  176. 175
  177. 176
  178. 177
  179. 178
  180. 179
  181. 180
  182. 181
  183. 182
  184. 183
  185. 184
  186. 185
  187. 186
  188. 187
  189. 188
  190. 189
  191. 190
  192. 191
  193. 192
  194. 193
  195. 194
  196. 195
  197. 196
  198. 197
  199. 198
  200. 199
  201. 200
  202. 201
  203. 202
  204. 203
  205. 204
  206. 205
  207. 206
  208. 207
  209. 208
  210. 209
  211. 210
  212. 211
  213. 212
  214. 213
  215. 214
  216. 215
  217. 216
  218. 217
  219. 218
  220. 219
  221. 220
  222. 221
  223. 222
  224. 223
  225. 224
  226. 225
  227. 226
  228. 227
  229. 228
  230. 229
  231. 230
  232. 231
  233. 232
  234. 233
  235. 234
  236. 235
  237. 236
  238. 237
  239. 238
  240. 239
  241. 240
  242. 241
  243. 242
  244. 243
  245. 244
  246. 245
  247. 246
  248. 247
  249. 248
  250. 249
  251. 250
  252. 爬取完毕
  253. Process finished with exit code 0

因为我抓取的是豆瓣前250项 一页25个 一共十页

运行后在此项目中会出现一个.db文件 一个Excle文件

 先点开Excle表格看一下

一共有250行  有8列

然后点开db文件看一下  是一些乱码

这时候打开命令行 输入所学过的指令

然后会出现一个.sql文件

 

 到此就结束啦~

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号