爬取豆瓣电影排行榜

准备工作

首先引入包

  1. from bs4 import BeautifulSoup #网页解析,获取数据
  2. import re #正则表达式,进行文字匹配
  3. import urllib.request,urllib.error #制定url,获取网页数据
  4. import xlwt #进行excel操作
  5. import sqlite3 #sqlite数据库操作

urllib的介绍

urllib是一个爬虫函数库,非常实用。在python2时,有urllib和urllib2.0,到了python3,将这两个urllib结合了。

可以进入http://httpbin.org/ 该测试界面,更能了解爬虫的作用

获取一个get请求

get请求通常为

  1. import urllib.request #包的导入
  2. #urllib.request.urlopen() 打开指定网页,获取其中的信息
  3. #response.read().decode('utf-8') 对获取到的网页进行读的操作,并且转换成utf-8的形式
  4. response = urllib.request.urlopen("http://www.baidu.com")
  5. print(response.read().decode('utf-8'))
  6. #将会把百度页面的代码给爬下来

获取一个post请求

  1. import urllib.parse #额外导入一个包,用来转换数据
  2. date = bytes(urllib.parse.urlencode({ #设置post数据
  3. "hello":"world"
  4. }),encoding="utf-8") #必须转换成utf-8才可以使用
  5. response = urllib.request.urlopen("http://httpbin.org/post",data=date)
  6. print(response.read().decode('utf-8'))

超时处理

有些时候难免会出现禁止爬虫,网速太慢的情况。会一直卡着,并且需要手动退出,此时我们需要添加个额外数值

  1. try:
  2. response = urllib.request.urlopen("http://httpbin.org/get",timeout=1)
  3. #如果1秒后没有响应,会停止程序,并且报错
  4. print(response.read().decode('utf-8'))
  5. except urllib.error.URLError as e:
  6. print("timeout")

一些属性

  1. response = urllib.request.urlopen("http://httpbin.org/get", timeout=1)
  2. print(response.status) # 获取状态码
  3. print(response.getheader("Server"))

定制请求头,不让网页发现我们是爬虫

  1. url = "https://www.douban.com" #设置url
  2. url_s = "http://httpbin.org/post"
  3. header = { #设置请求头
  4. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40"
  5. }
  6. #使用Request方法
  7. request = urllib.request.Request(url=url, headers=header)
  8. response = urllib.request.urlopen(request)
  9. print(response.read().decode("utf-8"))
  10. #添加post数据
  11. data = bytes(urllib.parse.urlencode({
  12. 'name': 'liao'
  13. }),encoding='utf-8')
  14. request_s = urllib.request.Request(url=url_s, headers=header, method="POST")
  15. response_s = urllib.request.urlopen(request_s)
  16. print(response_s.read().decode('utf-8'))

Bs4获取数据

我们使用bs4来进行演示

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <div>
  9. <ul>
  10. <li id ="liao1">张三</li>
  11. <li id = "l2">李四</li>
  12. <li>王五</li>
  13. <a href="" class="a1">里奥奥</a>
  14. <span>test hahahah</span>
  15. </ul>
  16. </div>
  17. <a href="" title="a2">baidu</a>
  18. <div id="d1">
  19. <span>
  20. 笑死我了,全是男同
  21. </span>
  22. </div>
  23. <p id="wuhu" class="qwq">wdnmd</p>
  24. </body>
  25. </html>
  1. from bs4 import BeautifulSoup
  2. soup = BeautifulSoup(open('test.html',encoding='utf-8'),'lxml')
  3. #1.根据标签名称查找
  4. print(soup.a) #查找第一个标签为a的内容
  5. print(soup.a.attrs) #展示标签的属性和属性值
  6. #bs4的一些函数
  7. #1.find
  8. print(soup.find('a')) #查找第一个标签为a的内容
  9. print(soup.find('a',title="a2")) #查找第一个标签为a并且title=a2的内容
  10. print(soup.find('a',class_="a1")) #查找第一个标签为a并且class=1的内容
  11. #2.find_all
  12. print(soup.find_all('a')) #查找所有的a标签,并且返回列表
  13. print(soup.find_all(['a','span'])) #查找所有的a和span标签
  14. print(soup.find_all('li',limit=2)) #查找li标签,前两个的内容
  15. #3.select
  16. print(soup.select('a')) #查找所有a标签,返回列表
  17. print(soup.select(('.a1'))) #查找class为a1的内容
  18. print(soup.select('#liao1')) #查找id为liao1的内容
  19. #属性选择器
  20. print(soup.select('li[id]')) #查找li中包含id属性的内容
  21. print(soup.select('li[id="l2"]')) #查找li中id为l2的内容
  22. #层级选择器
  23. #后代
  24. print(soup.select('div li')) #查找div后代有li的内容
  25. #子代
  26. print(soup.select('div > ul > li')) #查找div后ul后li的内容
  27. print(soup.select('a,li')) #查找a标签和li标签的所有对象
  28. #节点信息
  29. obj = soup.select('#d1')[0] #查找id为d1的属性的第一个内容
  30. print(obj) #打印html
  31. print(obj.get_text()) #只打印字符内容
  32. #节点属性
  33. obj = soup.select('#wuhu')[0]
  34. print(soup.select('#wuhu'))
  35. print(obj.name) #打印该内容的属性值
  36. #获取节点的
  37. print(obj.attrs.get('class')) #打印class属性的值
  38. print(obj.get('class')) #打印class属性的值
  39. print(obj['class']) #打印class属性的值

正则表达式

Python爬取豆瓣电影排行榜 - 图1

Python爬取豆瓣电影排行榜 - 图2

Python爬取豆瓣电影排行榜 - 图3

Python爬取豆瓣电影排行榜 - 图4

示例:

  1. #正则表达式:字符串模式,判断字符串是否符合一定的规律
  2. import re
  3. # 创建模板对象
  4. pat = re.compile("AA") #此处的AA 是正则表达式 用来去验证其他的字符串
  5. m = pat.search("AABCAABADAA") #search方法,查找是否存在字符并且打印位置信息
  6. print(m) #<re.Match object; span=(3, 5), match='AA'>
  7. #没有模板对象
  8. n = re.search("ABC","ASDABC") #前面的字符串是规则,后面的是被校验的对象
  9. print(n)
  10. #findall 打印出相匹配的内容
  11. print(re.findall("a","asdcawerqaa")) #前面是规则,后面是被校验的字符串
  12. #查找所有的大写字母
  13. print(re.findall("[A-Z]","ASDCsdsaSADW"))
  14. #查找所有大写字母
  15. print(re.findall("[A-Z]+","ASDCsdsaSADW"))
  16. #查找不包含a的字母
  17. print(re.findall("[^a]","abcsadwcasabccx"))
  18. #sub 内容替换
  19. print(re.sub("a","A","asdcasADASD")) #找到a用A来替换第三个字符串的内容
  20. #建议在正则表达式中,被比较的字符串前面加上r,不用担心转义字符的问题

数据保存

保存到excel

将所打印的数据保存到excel文件中。

流程:创建workbook对象——创建工作表——添加数据——保存workbook

  1. import xlwt #导入包
  2. workbook = xlwt.Workbook(encoding='utf-8') # 创建workbook对象
  3. worksheet = workbook.add_sheet('sheet1') # 创建工作表
  4. worksheet.write(0, 0, 'hello') # 写入数据,第一个为”行“,第二个为”列“
  5. for i in range(1, 10):
  6. for j in range(1, i + 1):
  7. worksheet.write(i-1, j-1, '%d*%d=%d' % (i, j, i * j))
  8. workbook.save('student.xls')

保存到sqlite

  1. import sqlite3
  2. # 连接数据表
  3. conn = sqlite3.connect("test.db") # 在当前路径创建数据库
  4. print("成功打开数据库")
  5. c = conn.cursor() # 获取游标
  6. # 创建数据表
  7. sql1 = '''
  8. create table company
  9. (id int primary key not null,
  10. name text not null,
  11. age int not null,
  12. address char(50),
  13. salary real);
  14. '''
  15. c.execute(sql1) # 执行sql语句
  16. print("成功创建表")
  17. # 插入数据
  18. sql2 = '''
  19. insert into company(id,name,age,address,salary)
  20. values (1,"张三",32,"成都",8000)
  21. '''
  22. c.execute(sql2) # 执行sql语句
  23. # 查询数据
  24. sql3 = '''
  25. select id,name,address,salary from company;
  26. '''
  27. cursor = c.execute(sql3)
  28. for row in cursor:
  29. print(row[0])
  30. print(row[1])
  31. print(row[2])
  32. print(row[3])
  33. print("查询完毕")
  34. conn.commit() # 提交数据库操作
  35. conn.close() # 关闭数据库连接

代码示例

将数据保存在excel

  1. # -*- coding = utf-8 -*-
  2. # @Time : 2022/1/2 19:38
  3. # @Author : LiAo
  4. # @File : spider_douban.py
  5. # @Software : PyCharm
  6. from bs4 import BeautifulSoup # 网页解析,获取数据
  7. import re # 正则表达式,进行文字匹配
  8. import urllib.request, urllib.error # 制定url,获取网页数据
  9. import xlwt # 进行excel操作
  10. import sqlite3 # sqlite数据库操作
  11. def main():
  12. baseurl = "https://movie.douban.com/top250?start="
  13. # 1.爬取网页
  14. datalist = getData(baseurl)
  15. # 3.保存数据
  16. savepath = "豆瓣电影top250.xls"
  17. saveData(datalist, savepath)
  18. askURL("https://movie.douban.com/top250?start=")
  19. # 影片的链接
  20. findLink = re.compile(r'<a href="(.*?)">') # 创建正则表达式对象
  21. # 影片的图片
  22. findImageSrc = re.compile(r'<img.*src="(.*?)"', re.S) # 让换行符包含在字符中
  23. # 影片的片名
  24. findTitle = re.compile(r'<span class="title">(.*)</span>')
  25. # 影片的评分
  26. findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
  27. # 评价人数
  28. findJudge = re.compile(r'<span>(\d*)人评价</span>')
  29. # 找到概况
  30. findInq = re.compile(r'<span class="inq">(.*)</span>')
  31. # 影片信息
  32. findBd = re.compile(r'<p class="">(.*?)</p>', re.S)
  33. # 爬取网页
  34. def getData(baseurl):
  35. datalist = [] # 获取的网页的数据
  36. for i in range(0, 10): # 调用获取页面信息的函数!10次。
  37. url = baseurl + str(i * 25)
  38. html = askURL(url) # 保存获取到的网页源码
  39. # 逐一进行解析
  40. soup = BeautifulSoup(html, "html.parser")
  41. for item in soup.find_all('div', class_="item"): # 查找符合要求的字符串,形成列表
  42. # print(item)
  43. data = [] # 保存一部电影的信息
  44. item = str(item)
  45. links = re.findall(findLink, item)[0] # re库,通过正则查找字符串模式
  46. data.append(links)
  47. imgSrc = re.findall(findImageSrc, item)[0]
  48. data.append(imgSrc)
  49. titles = re.findall(findTitle, item) # 片名可能只有一个
  50. if len(titles) == 2:
  51. ctitle = titles[0] # 添加中文名
  52. data.append(ctitle)
  53. otitle = titles[1].replace("/", "") # 无关的符号
  54. data.append(otitle) # 添加中国名
  55. else:
  56. data.append(titles[0])
  57. data.append(" ") # 因为要加入到excel,要给外国名留空
  58. rating = re.findall(findRating, item)[0]
  59. data.append(rating)
  60. judge = re.findall(findJudge, item)[0]
  61. data.append(judge)
  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(r'<br(\s+)?/>(\s+?)', " ", bd) # 去掉br/
  70. bd = re.sub(r'/', " ", bd)
  71. data.append(bd.strip()) # 去掉前后空格
  72. datalist.append(data) # 将处理好的data添加到datalist
  73. print(datalist)
  74. return datalist
  75. # 得到指定一个URL的网页内容
  76. def askURL(url):
  77. header = { # 模拟浏览器头部信息,向网页服务器发送消息
  78. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40"
  79. }
  80. request = urllib.request.Request(url=url, headers=header)
  81. html = ""
  82. try:
  83. response = urllib.request.urlopen(request)
  84. html = response.read().decode('utf-8')
  85. # print(html)
  86. except urllib.error.URLError as e:
  87. if hasattr(e, 'code'):
  88. print(e.code)
  89. if hasattr(e, 'reason'):
  90. print(e.reason)
  91. return html
  92. # 保存数据
  93. def saveData(datalist, savePath):
  94. workbook = xlwt.Workbook(encoding='utf-8') # 创建workbook对象
  95. worksheet = workbook.add_sheet('豆瓣电影top250', cell_overwrite_ok=True) # 创建工作表
  96. col = ('电影详情连接', "图片连接", "中文名", "外国名", "评分", "评价数", "概况", "相关信息")
  97. for i in range(0, 8):
  98. worksheet.write(0, i, col[i])
  99. for i in range(0, 250):
  100. print("第%d条" % (i+1))
  101. data = datalist[i]
  102. for j in range(0, 8):
  103. worksheet.write(i + 1, j, data[j])
  104. workbook.save(savePath) # 保存到excel
  105. if __name__ == "__main__":
  106. main()
  107. print("爬取完毕")

保存到sqlite

  1. # -*- coding = utf-8 -*-
  2. # @Time : 2022/1/2 19:38
  3. # @Author : LiAo
  4. # @File : spider_douban.py
  5. # @Software : PyCharm
  6. from bs4 import BeautifulSoup # 网页解析,获取数据
  7. import re # 正则表达式,进行文字匹配
  8. import urllib.request, urllib.error # 制定url,获取网页数据
  9. import xlwt # 进行excel操作
  10. import sqlite3 # sqlite数据库操作
  11. def main():
  12. baseurl = "https://movie.douban.com/top250?start="
  13. # 1.爬取网页
  14. datalist = getData(baseurl)
  15. # 3.保存数据
  16. # savepath = "豆瓣电影top250.xls"
  17. # saveData(datalist, savepath)
  18. # askURL("https://movie.douban.com/top250?start=")
  19. dbpath = "movie.db"
  20. saveData2DB(datalist, dbpath)
  21. # 影片的链接
  22. findLink = re.compile(r'<a href="(.*?)">') # 创建正则表达式对象
  23. # 影片的图片
  24. findImageSrc = re.compile(r'<img.*src="(.*?)"', re.S) # 让换行符包含在字符中
  25. # 影片的片名
  26. findTitle = re.compile(r'<span class="title">(.*)</span>')
  27. # 影片的评分
  28. findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
  29. # 评价人数
  30. findJudge = re.compile(r'<span>(\d*)人评价</span>')
  31. # 找到概况
  32. findInq = re.compile(r'<span class="inq">(.*)</span>')
  33. # 影片信息
  34. findBd = re.compile(r'<p class="">(.*?)</p>', re.S)
  35. # 爬取网页
  36. def getData(baseurl):
  37. datalist = [] # 获取的网页的数据
  38. for i in range(0, 10): # 调用获取页面信息的函数!10次。
  39. url = baseurl + str(i * 25)
  40. html = askURL(url) # 保存获取到的网页源码
  41. # 逐一进行解析
  42. soup = BeautifulSoup(html, "html.parser")
  43. for item in soup.find_all('div', class_="item"): # 查找符合要求的字符串,形成列表
  44. # print(item)
  45. data = [] # 保存一部电影的信息
  46. item = str(item)
  47. links = re.findall(findLink, item)[0] # re库,通过正则查找字符串模式
  48. data.append(links)
  49. imgSrc = re.findall(findImageSrc, item)[0]
  50. data.append(imgSrc)
  51. titles = re.findall(findTitle, item) # 片名可能只有一个
  52. if len(titles) == 2:
  53. ctitle = titles[0] # 添加中文名
  54. data.append(ctitle)
  55. otitle = titles[1].replace("/", "") # 无关的符号
  56. data.append(otitle) # 添加中国名
  57. else:
  58. data.append(titles[0])
  59. data.append(" ") # 因为要加入到excel,要给外国名留空
  60. rating = re.findall(findRating, item)[0]
  61. data.append(rating)
  62. judge = re.findall(findJudge, item)[0]
  63. data.append(judge)
  64. inq = re.findall(findInq, item)
  65. if len(inq) != 0:
  66. inq = inq[0].replace("。", "") # 去掉句号
  67. data.append(inq)
  68. else:
  69. data.append(" ")
  70. bd = re.findall(findBd, item)[0]
  71. bd = re.sub(r'<br(\s+)?/>(\s+?)', " ", bd) # 去掉br/
  72. bd = re.sub(r'/', " ", bd)
  73. data.append(bd.strip()) # 去掉前后空格
  74. datalist.append(data) # 将处理好的data添加到datalist
  75. print(datalist)
  76. return datalist
  77. # 得到指定一个URL的网页内容
  78. def askURL(url):
  79. header = { # 模拟浏览器头部信息,向网页服务器发送消息
  80. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40"
  81. }
  82. request = urllib.request.Request(url=url, headers=header)
  83. html = ""
  84. try:
  85. response = urllib.request.urlopen(request)
  86. html = response.read().decode('utf-8')
  87. # print(html)
  88. except urllib.error.URLError as e:
  89. if hasattr(e, 'code'):
  90. print(e.code)
  91. if hasattr(e, 'reason'):
  92. print(e.reason)
  93. return html
  94. # 保存数据
  95. def saveData(datalist, savePath):
  96. workbook = xlwt.Workbook(encoding='utf-8') # 创建workbook对象
  97. worksheet = workbook.add_sheet('豆瓣电影top250', cell_overwrite_ok=True) # 创建工作表
  98. col = ('电影详情连接', "图片连接", "中文名", "外国名", "评分", "评价数", "概况", "相关信息")
  99. for i in range(0, 8):
  100. worksheet.write(0, i, col[i])
  101. for i in range(0, 250):
  102. print("第%d条" % (i + 1))
  103. data = datalist[i]
  104. for j in range(0, 8):
  105. worksheet.write(i + 1, j, data[j])
  106. workbook.save(savePath) # 保存到excel
  107. def saveData2DB(datalist, dbpath):
  108. init_db(dbpath)
  109. conn = sqlite3.connect(dbpath)
  110. cur = conn.cursor()
  111. for data in datalist:
  112. for index in range(len(data)):
  113. if index == 4 or index == 5:
  114. continue
  115. data[index] = '"' + data[index] + '"'
  116. sql = '''
  117. insert into movie250(
  118. info_link,pic_link,cname,ename,score,rated,instroduction,info
  119. )values(%s)''' % ",".join(data) # 将data列表用,连接起来
  120. cur.execute(sql)
  121. conn.commit()
  122. cur.close()
  123. conn.close()
  124. def init_db(dbpath):
  125. sql = '''
  126. create table movie250(
  127. id integer primary key autoincrement,
  128. info_link text,
  129. pic_link text,
  130. cname varchar,
  131. ename varchar,
  132. score numeric,
  133. rated numeric ,
  134. instroduction text,
  135. info text
  136. );
  137. ''' # 创建数据表
  138. conn = sqlite3.connect(dbpath)
  139. cursor = conn.cursor() # 获取游标
  140. cursor.execute(sql) # 执行语句
  141. conn.commit() # 提交数据库操作
  142. conn.close() # 保存并关闭数据库
  143. if __name__ == "__main__":
  144. main()
  145. # init_db("moivetest.db")
  146. print("爬取完毕")

详细注释版

  1. # -*- coding = utf-8 -*-
  2. # @Time : 2022/1/2 19:38
  3. # @Author : LiAo
  4. # @File : spider_douban.py
  5. # @Software : PyCharm
  6. from bs4 import BeautifulSoup # 网页解析,获取数据
  7. import re # 正则表达式,进行文字匹配
  8. import urllib.request, urllib.error # 制定url,获取网页数据
  9. import xlwt # 进行excel操作
  10. import sqlite3 # sqlite数据库操作
  11. def main():
  12. #爬取的网页,这里末尾不能填写0。
  13. baseurl = "https://movie.douban.com/top250?start="
  14. datalist = getData(baseurl)
  15. # savepath = "豆瓣电影top250.xls"
  16. # saveData(datalist, savepath)
  17. # askURL("https://movie.douban.com/top250?start=")
  18. dbpath = "movie.db"
  19. saveData2DB(datalist, dbpath)
  20. # 影片的链接
  21. findLink = re.compile(r'<a href="(.*?)">') # 创建正则表达式对象
  22. # 影片的图片
  23. findImageSrc = re.compile(r'<img.*src="(.*?)"', re.S) # 让换行符包含在字符中
  24. # 影片的片名
  25. findTitle = re.compile(r'<span class="title">(.*)</span>')
  26. # 影片的评分
  27. findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
  28. # 评价人数
  29. findJudge = re.compile(r'<span>(\d*)人评价</span>')
  30. # 找到概况
  31. findInq = re.compile(r'<span class="inq">(.*)</span>')
  32. # 影片信息
  33. findBd = re.compile(r'<p class="">(.*?)</p>', re.S)
  34. # 爬取网页
  35. def getData(baseurl):
  36. datalist = [] # 获取的网页的数据
  37. for i in range(0, 10): # 调用获取页面信息的函数!10次。
  38. url = baseurl + str(i * 25)
  39. html = askURL(url) # 保存获取到的网页源码
  40. # 逐一进行解析
  41. soup = BeautifulSoup(html, "html.parser")
  42. for item in soup.find_all('div', class_="item"): # 查找符合要求的字符串,形成列表
  43. # print(item)
  44. data = [] # 保存一部电影的信息
  45. item = str(item)
  46. links = re.findall(findLink, item)[0] # re库,通过正则查找字符串模式
  47. data.append(links)
  48. imgSrc = re.findall(findImageSrc, item)[0]
  49. data.append(imgSrc)
  50. titles = re.findall(findTitle, item) # 片名可能只有一个
  51. if len(titles) == 2:
  52. ctitle = titles[0] # 添加中文名
  53. data.append(ctitle)
  54. otitle = titles[1].replace("/", "") # 无关的符号
  55. data.append(otitle) # 添加中国名
  56. else:
  57. data.append(titles[0])
  58. data.append(" ") # 因为要加入到excel,要给外国名留空
  59. rating = re.findall(findRating, item)[0]
  60. data.append(rating)
  61. judge = re.findall(findJudge, item)[0]
  62. data.append(judge)
  63. inq = re.findall(findInq, item)
  64. if len(inq) != 0:
  65. inq = inq[0].replace("。", "") # 去掉句号
  66. data.append(inq)
  67. else:
  68. data.append(" ")
  69. bd = re.findall(findBd, item)[0]
  70. bd = re.sub(r'<br(\s+)?/>(\s+?)', " ", bd) # 去掉br/
  71. bd = re.sub(r'/', " ", bd)
  72. data.append(bd.strip()) # 去掉前后空格
  73. datalist.append(data) # 将处理好的data添加到datalist
  74. print(datalist)
  75. return datalist
  76. # 得到指定一个URL的网页内容
  77. def askURL(url):
  78. header = { # 模拟浏览器头部信息,向网页服务器发送消息
  79. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40"
  80. }
  81. request = urllib.request.Request(url=url, headers=header)
  82. html = ""
  83. try:
  84. response = urllib.request.urlopen(request)
  85. html = response.read().decode('utf-8')
  86. # print(html)
  87. except urllib.error.URLError as e:
  88. if hasattr(e, 'code'):
  89. print(e.code)
  90. if hasattr(e, 'reason'):
  91. print(e.reason)
  92. return html
  93. # 保存数据
  94. def saveData(datalist, savePath):
  95. workbook = xlwt.Workbook(encoding='utf-8') # 创建workbook对象
  96. worksheet = workbook.add_sheet('豆瓣电影top250', cell_overwrite_ok=True) # 创建工作表
  97. col = ('电影详情连接', "图片连接", "中文名", "外国名", "评分", "评价数", "概况", "相关信息")
  98. for i in range(0, 8):
  99. worksheet.write(0, i, col[i])
  100. for i in range(0, 250):
  101. print("第%d条" % (i + 1))
  102. data = datalist[i]
  103. for j in range(0, 8):
  104. worksheet.write(i + 1, j, data[j])
  105. workbook.save(savePath) # 保存到excel
  106. def saveData2DB(datalist, dbpath):
  107. init_db(dbpath)
  108. conn = sqlite3.connect(dbpath)
  109. cur = conn.cursor()
  110. for data in datalist:
  111. for index in range(len(data)):
  112. if index == 4 or index == 5:
  113. continue
  114. data[index] = '"' + data[index] + '"'
  115. sql = '''
  116. insert into movie250(
  117. info_link,pic_link,cname,ename,score,rated,instroduction,info
  118. )values(%s)''' % ",".join(data) # 将data列表用,连接起来
  119. cur.execute(sql)
  120. conn.commit()
  121. cur.close()
  122. conn.close()
  123. def init_db(dbpath):
  124. sql = '''
  125. create table movie250(
  126. id integer primary key autoincrement,
  127. info_link text,
  128. pic_link text,
  129. cname varchar,
  130. ename varchar,
  131. score numeric,
  132. rated numeric ,
  133. instroduction text,
  134. info text
  135. );
  136. ''' # 创建数据表
  137. conn = sqlite3.connect(dbpath)
  138. cursor = conn.cursor() # 获取游标
  139. cursor.execute(sql) # 执行语句
  140. conn.commit() # 提交数据库操作
  141. conn.close() # 保存并关闭数据库
  142. if __name__ == "__main__":
  143. main()
  144. # init_db("moivetest.db")
  145. print("爬取完毕")