学期:2021-2022学年第一学期

    学 院 大数据与智能工程学院 年 级、 专 业、 班 18级数据科学与大数据技术(专升本)一班 姓 名
    学号
    实验项目 名称 豆瓣读书热门榜单数据获取

    实验学时: 3h 同组学生姓名: 王美琴、尤博欣、周青青、李昕辰 实验地点: 9317
    实验日期: 实验成绩: 批改教师: 批改时间:
    指导教师评阅:

    1. 实验目的:网页解析的方式简单爬取豆瓣读书热门榜单数据
    2. 实验原理:requests请求、bs4网页解析
    3. 实验环境 :win10、python3.9、vscode、edge
    4. 实验步骤:
      1. http请求获取页面数据
      2. bs4解析页面

    核心代码:

    1. ### 网页解析的方式简单爬取豆瓣图书新书速递内容
    2. import requests
    3. from bs4 import BeautifulSoup
    4. import re
    5. import csv
    6. import os
    7. # 保存到csv文件
    8. def saveContent(result):
    9. with open(path + "/out.csv", 'w', newline="", encoding="utf-8") as f:
    10. fieldnames = result[0].keys()
    11. writer = csv.DictWriter(f, fieldnames)
    12. writer.writerows(result)
    13. # 缓存列表中的图片
    14. def saveImg(url, name):
    15. img = requests.get(url, headers=headers).content
    16. with open(path + "/{}.jpg".format(name), "wb") as f:
    17. f.write(img)
    18. if __name__ == "__main__":
    19. # 确立目录
    20. path = "./spider/test/code1_out"
    21. if not os.path.exists(path):
    22. os.makedirs(path)
    23. # 构造请求
    24. url = "https://book.douban.com/"
    25. headers = {
    26. 'User-Agent':
    27. 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.47'
    28. }
    29. strhtml = requests.get(url, headers=headers)
    30. print(strhtml.encoding)
    31. # BeautifulSoup解析选择网页
    32. soup = BeautifulSoup(strhtml.text, 'lxml')
    33. data = soup.select(
    34. "#content > div > div.article > div.section.books-express > div.bd > div > div > ul:nth-child(2) > li"
    35. )
    36. result = list()
    37. for item in data:
    38. title = item.select("div.info > div.title > a")[0]
    39. author = item.select("div.info > div.author")[0]
    40. img = item.select("div.cover > a > img")[0]
    41. one = {
    42. "id": re.findall(r'\d+', title.get("href"))[0],
    43. "title": title.get_text(),
    44. "href": title.get("href"),
    45. "img": img.get("src"),
    46. "alt": img.get("alt")
    47. }
    48. result.append(one)
    49. saveImg(img.get("src"), os.path.basename(img.get("src")))
    50. saveContent(result)
    1. 实验结果及分析:

    通过requests库提供方法请求网页url,得到网页数据,并通过BeautifulSoup库对网页数据结构进行解析,分析并提取指定数据。

    1. 实验总结:

      通过豆瓣读书热门榜单数据获取的实验,实验小组成员们在实践实验当中发现抓取程序并不复杂,但由于数据量较大,我们需要不断重复的访问豆瓣网页,这就不可避免的会被豆瓣的反扒机制发现,这就需要我们创建ip池,不断的改变自己的ip。