当前位置:   article > 正文

python爬虫爬取豆瓣top250

python爬虫爬取豆瓣top250

what's 爬虫?

简单来说:

爬虫,即网络蜘蛛,是伪装客户端服务器进行数据交互程序

爬取豆瓣top250

本人大一,为了学习python写个爬虫,代码需要优化的地方,还望各位大佬能不吝赐教!写博客的初心只是为了记录学习,如果对大家有帮助就更好了。

一些底层的东西可以看看别的博文

代码

  1. from bs4 import BeautifulSoup #网页解析
  2. import urllib.request,urllib.error #制定URL,获取网页数据
  3. import re #正则表达式 进行文字匹配
  4. import xlwt #进行excel操作
  5. from tqdm import trange #进度条库
  6. def main():
  7. baseurl = "https://movie.douban.com/top250?start="
  8. # 1.爬取网页
  9. # 2.逐一解析数据
  10. datalist =getDate(baseurl)
  11. # 3.保存数据
  12. savepath = "豆瓣top250.xls"
  13. savedata(datalist,savepath)
  14. #影片详情链接
  15. findLink = re.compile(r'<a href="(.*?)">') #创建正则表达式,表示规则(字符串的模式)
  16. #影片图片的链接
  17. findImagesrc = re.compile( r'<img[^>]+src=["\']([^"\']+)["\']') #ai写的正则
  18. #影片中文片名
  19. findName = re.compile(r'<span class="title">(.*)</span>')
  20. #影片评分
  21. findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
  22. #影片热评
  23. findComment = re.compile(r'<span class="inq">(.*?)</span>')
  24. def getDate(baseurl):
  25. datalist = []
  26. # 1.爬取网页
  27. for i in trange(0,10):
  28. url = baseurl + str(i*25)
  29. html = askURL(url) #保存获取到的网络源码
  30. soup = BeautifulSoup(html,"html.parser")
  31. for item in soup.find_all('div',class_="item"):
  32. # 2.逐一解析数据
  33. item =str(item)
  34. data=[]
  35. name = re.findall(findName,item)[0]
  36. data.append(name)
  37. link = re.findall(findLink,item)[0]
  38. data.append(link)
  39. img = re.findall(findImagesrc,item)[0]
  40. data.append(img)
  41. rating = re.findall(findRating,item)
  42. data.append(rating)
  43. comment = re.findall(findComment,item)
  44. if len(comment)!=0:
  45. comment=comment[0].replace("。","")
  46. data.append(comment)
  47. else:
  48. data.append(" ")
  49. datalist.append(data)
  50. return datalist
  51. def askURL(url):
  52. head={
  53. "User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36 Edg/121.0.0.0"
  54. }
  55. request = urllib.request.Request(url,headers=head)
  56. html= ""
  57. try:
  58. response=urllib.request.urlopen(request)
  59. html=response.read().decode("utf-8")
  60. except urllib.error.URLError as e:
  61. if hasattr(e,"code"):
  62. print(e.code)
  63. if hasattr(e,"reason"):
  64. print(e.reason)
  65. return html
  66. def savedata(datalist,savepath):
  67. book = xlwt.Workbook(encoding="utf-8",style_compression=0) #压缩样式效果,设为0
  68. sheet = book.add_sheet('top250',cell_overwrite_ok=True) #每个单元在写入时覆盖以前的内容
  69. col = ('电影中文名','电影详情链接','图片链接','电影评分','电影热评')
  70. for i in range(0,len(col)):
  71. sheet.write(0,i,col[i]) #列名
  72. for i in range (0,250):
  73. data = datalist[i]
  74. for j in range (0,len(col)):
  75. sheet.write(i+1,j,data[j])
  76. book.save(savepath)
  77. if __name__ == "__main__":
  78. main()
  79. print("爬取完成")

需要用到的库:

from bs4 import BeautifulSoup           #网页解析
import urllib.request,urllib.error           #制定URL,获取网页数据
import re                                             #正则表达式  进行文字匹配
import xlwt                                          #进行excel操作
from tqdm import trange                    

#进度条库,当然你也可以不用,这个库只需要把for循环里的range改为trange,你就可以得到一个进度条

 思路

1.获取网页的源码

  1. def askURL(url):
  2. head={
  3. "User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36 Edg/121.0.0.0"
  4. }
  5. request = urllib.request.Request(url,headers=head)
  6. html= ""
  7. try:
  8. response=urllib.request.urlopen(request)
  9. html=response.read().decode("utf-8")
  10. #print(html)
  11. except urllib.error.URLError as e:
  12. if hasattr(e,"code"):
  13. print(e.code)
  14. if hasattr(e,"reason"):
  15. print(e.reason)
  16. return html
制定url
  1. for i in trange(0,10):
  2. url = baseurl + str(i*25)

用个循环,根据网页制定一下url

找到用于伪装客户端User-Agent

在network里刷新一下网页,找到发送的标头header

这个是user-agent:Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36 Edg/121.0.0.0

用urllib获取你制定的url的源码

在 try 块中:

调用 urllib.request.urlopen(request) 发送HTTP请求,并获取响应对象 response。
通过 response.read() 获取服务器返回的原始二进制数据。
使用 decode("utf-8") 方法将二进制数据解码成UTF-8编码的字符串,并将其赋值给变量 html。
如果在执行 urlopen 函数过程中出现 urllib.error.URLError 异常,则进入 except 块:

判断异常对象是否包含 .code 属性,如果有则打印出HTTP状态码。
再判断异常对象是否包含 .reason 属性,如果有则打印出错误原因。
最后,无论是否发生异常,都返回抓取到的网页HTML内容(即变量 html)

2.解析数据

  1. def getDate(baseurl):
  2. datalist = []
  3. # 1.爬取网页
  4. for i in trange(0,10):
  5. url = baseurl + str(i*25)
  6. html = askURL(url) #保存获取到的网络源码
  7. soup = BeautifulSoup(html,"html.parser")
  8. for item in soup.find_all('div',class_="item"):
  9. # 2.逐一解析数据
  10. item =str(item)
  11. data=[]
  12. name = re.findall(findName,item)[0]
  13. data.append(name)
  14. link = re.findall(findLink,item)[0]
  15. data.append(link)
  16. img = re.findall(findImagesrc,item)[0]
  17. data.append(img)
  18. rating = re.findall(findRating,item)
  19. data.append(rating)
  20. comment = re.findall(findComment,item)
  21. if len(comment)!=0:
  22. comment=comment[0].replace("。","")
  23. data.append(comment)
  24. else:
  25. data.append(" ")
  26. datalist.append(data)
  27. return datalist
BeautifulSoup

bs4是一个强大的库,用于从HTML和XML文件中提取数据,它能够将复杂的HTML结构转换成树形结构(即元素树),使得开发者可以方便地搜索、遍历以及修改网页内容。


"html.parser": 这是BeautifulSoup用来解析HTML文档的解析器。在这个案例中,它是指Python自带的标准HTML解析器。除了标准的解析器外,BeautifulSoup还可以配合其他第三方解析器如 lxml 来使用。

用bs4和re筛选信息

3.数据写入excel表中

需要用到xwlt库

  1. def savedata(datalist,savepath):
  2. book = xlwt.Workbook(encoding="utf-8",style_compression=0) #压缩样式效果,设为0
  3. sheet = book.add_sheet('top250',cell_overwrite_ok=True) #每个单元在写入时覆盖以前的内容
  4. col = ('电影中文名','电影详情链接','图片链接','电影评分','电影热评')
  5. for i in range(0,len(col)):
  6. sheet.write(0,i,col[i]) #列名
  7. for i in range (0,250):
  8. data = datalist[i]
  9. for j in range (0,len(col)):
  10. sheet.write(i+1,j,data[j])
  11. book.save(savepath)

完结撒花

路好不好走,也许我不能决定,但走不走,却只有我能决定。

                                                                                                         ----天官赐福

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

闽ICP备14008679号