当前位置:   article > 正文

Python实践项目:爬取当当网近七天热销书籍进行可视化分析_python爬虫爬取商品信息并可视化

python爬虫爬取商品信息并可视化

最近在跟HNU的学弟学妹交流时,了解到学校课程“计算与人工智能概论”(非计算机专业必修课)课程大作业是写一个爬虫来爬取数据进行可视化分析,感觉难度有点高就帮学弟学妹打个草稿,同时也是自己在学习的一个过程,这一个是岳麓书院计概的课程要求(应该文科都是这个),相对比较简单,帮助大家提供参考。(谁家好人给文科生出爬虫题啊)


网上资源太多太杂,错误的太多,大部分涉及到SQL,这一个相对比较简单,只需要python和jupyter就够了,会将最终数据存储到csv文件,如果是Hnu的同学,没有用过jupyter,可以通过老师让统一下载的Anaconda进行调用。其他的朋友的建议是Pycharm(吹爆),比spyder好看n倍,添加库之类的操作也会更简单。


废话少说正文开始:

题目:

分析:

相对来说题目二是比较简单的,只需要写个爬虫,爬几百条数据,再画个图就好了;题目一的话,爬本小说,用python的jieba库统计下人名,再用pyecharts绘制树形图,词云图就可以,但是情感分析这部分没有接触过,不知道怎么处理。

为了方便大家copy再创作我会把完整代码放在最后。

开始热血编程!

第一部分:所引用的库

  1. import random
  2. import requests
  3. import parsel
  4. import csv
  5. import time

 如何添加库请大家自行查询,这部分一定有耐心,因为下载失败可能有多种原因:

  1. 使用的是官方下载仓的时候,可能受到一些科学影响,可以更改为国内源
  2. 可能编译器是虚拟环境,而不是和笔记本相同的环境,导致cmd上显示下载了但是编译还是报错
  3. 可能你连pip都没有下载

 第二部分:添加目标网址

url = f'https://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-1'#爬取的目标网址,此网址是当当网近七日热销书籍第一页

 把想要爬取的网址,赋值给url

第三部分:模拟IP地址防止被拦截

  1. headers["X-Forwarded-For"] = "%s.%s.%s.%s" % (
  2. random.randrange(1, 200, 20), random.randrange(1, 200, 20), random.randrange(1, 200, 20),
  3. random.randrange(1, 200, 20))
  4. #这三行代码是用来更换ip地址,防止访问过于频繁被拦截,当当网比链家要难爬取一点

第四部分:编写headers,获取response,解析response

  1. headers = {
  2. 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0'
  3. }#编写头,用来模拟访问
  4. response = requests.get(url=url,headers=headers)
  5. #向指定服务器发送get请求,返回Response对象,这个Response对象返回包含了整个服务器的资源。
  6. selector = parsel.Selector(response.text)
  7. #parsel这个库可以解析HTML和XML,并支持使用Xpath和CSS选择器对内容进行提取和修改,同时还融合了正则表达式的提取功能。parsel灵活且强大,同时也是python最流行的爬虫框架Scrapy的底层支持
  8. #创建一个selector对象,向其传入text参数,内容就是上面的url字符串。
  9. #有了这个selector对象之后,我们可以使用css和xpath方法分别传入css选择器和xpath进行内容提取

headers使用开发者工具查看的,不会的同学可以自己去看一下,这部分也是比较麻烦的一部分,如何获取自己需要的信息,在后面都要用到

 第五部分:获取提取到li节点的内容

  1. lis = selector.css('ul.bang_list li')
  2. for li in lis:
  3. title = li.css('.name a::attr(title)').get()
  4. if title:
  5. try:
  6. href = li.css('.name a::attr(href)').get()
  7. comment = li.css('.star a::text').get().replace("条评论",'')
  8. recommend = li.css('.tuijian::text').get().replace('推荐','')
  9. author = li.css('div:nth-child(5) a::text').get()
  10. date = li.css('div:nth-child(6) span::text').get()
  11. publishingHouse = li.css('div:nth-child(6) a::text').get()
  12. price_n = li.css('.price p:nth-child(1) .price_n::text').get()
  13. price_r = li.css('.price p:nth-child(1) .price_r::text').get()
  14. price_s = li.css('.price p:nth-child(1) .price_s::text').get()
  15. price_e = li.css('.price p:nth-child(2) .price_n::text').get()
  16. dit = {
  17. '标题': title,
  18. '评论': comment,
  19. '推荐': recommend,
  20. '作者': author,
  21. '出版日期': date,
  22. '出版社': publishingHouse,
  23. '售价': price_n,
  24. '原价': price_r,
  25. '折扣': price_s,
  26. '电子书': price_e,
  27. '详情页': href,
  28. }
  29. except:
  30. pass

这个只符合我现在传入的网址的即当当网近七日热销书籍,不同的网页的li节点也不同,大家请根据自己要爬取的网页自行查看并更改 

 第六部分:创建并写入csv文件

  1. f = open('书籍data.csv',mode='a',encoding='utf-8',newline="")
  2. csv_write = csv.DictWriter(f,fieldnames=['标题','评论','推荐','作者','出版日期','出版社','售价','原价','折扣','电子书', '详情页'])
  3. csv_write.writeheader()#写入列表头

这个csv文件会出现你撰写的python文件的位置

 第七部分:观察不同页数的网址区别,找到共同点,实现爬取多页

  1. for page in range(1,26):
  2. time.sleep(1)#防止过快被拦截
  3. url = f'https://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-{page}'#爬取的目标网址,此网址是当当网近七日热销书籍 “{page}” 对应的是第几页

终章:进击的代码 

完整代码事例

  1. import random
  2. import requests
  3. import parsel
  4. import csv
  5. import time
  6. f = open('书籍data.csv',mode='a',encoding='utf-8',newline="")
  7. csv_write = csv.DictWriter(f,fieldnames=['标题','评论','推荐','作者','出版日期','出版社','售价','原价','折扣','电子书', '详情页'])
  8. csv_write.writeheader()
  9. for page in range(1,26):
  10. time.sleep(2)
  11. url = f'https://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-{page}'#爬取的目标网址,此网址是当当网近七日热销书籍 “{page}” 对应的是第几页
  12. headers = {
  13. 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0'
  14. }#编写头,用来模拟访问
  15. headers["X-Forwarded-For"] = "%s.%s.%s.%s" % (
  16. random.randrange(1, 200, 20), random.randrange(1, 200, 20), random.randrange(1, 200, 20),
  17. random.randrange(1, 200, 20))
  18. #这三行代码是用来更换ip地址,防止访问过于频繁被拦截,当当网比链家要难爬取一点
  19. response = requests.get(url=url,headers=headers)
  20. #向指定服务器发送get请求,返回Response对象,这个Response对象返回包含了整个服务器的资源。
  21. selector = parsel.Selector(response.text)
  22. #parsel这个库可以解析HTML和XML,并支持使用Xpath和CSS选择器对内容进行提取和修改,同时还融合了正则表达式的提取功能。parsel灵活且强大,同时也是python最流行的爬虫框架Scrapy的底层支持
  23. #创建一个selector对象,向其传入text参数,内容就是上面的url字符串。
  24. #有了这个selector对象之后,我们可以使用css和xpath方法分别传入css选择器和xpath进行内容提取
  25. lis = selector.css('ul.bang_list li')
  26. for li in lis:
  27. title = li.css('.name a::attr(title)').get()
  28. if title:
  29. try:
  30. href = li.css('.name a::attr(href)').get()
  31. comment = li.css('.star a::text').get().replace("条评论",'')
  32. recommend = li.css('.tuijian::text').get().replace('推荐','')
  33. author = li.css('div:nth-child(5) a::text').get()
  34. date = li.css('div:nth-child(6) span::text').get()
  35. publishingHouse = li.css('div:nth-child(6) a::text').get()
  36. price_n = li.css('.price p:nth-child(1) .price_n::text').get()
  37. price_r = li.css('.price p:nth-child(1) .price_r::text').get()
  38. price_s = li.css('.price p:nth-child(1) .price_s::text').get()
  39. price_e = li.css('.price p:nth-child(2) .price_n::text').get()
  40. dit = {
  41. '标题': title,
  42. '评论': comment,
  43. '推荐': recommend,
  44. '作者': author,
  45. '出版日期': date,
  46. '出版社': publishingHouse,
  47. '售价': price_n,
  48. '原价': price_r,
  49. '折扣': price_s,
  50. '电子书': price_e,
  51. '详情页': href,
  52. }
  53. csv_write.writerow(dit)
  54. except:
  55. pass

总结:

        感受到了文字的在传输知识上面的一些局限性,如果要爬取别的网址的数据的话,不建议改我的,因为太蛮烦了!!!代码前后是联系在一起的大家如果要应付老师作业的话还是直接抄把。可视化在下一节,大家可以去看专栏。

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

闽ICP备14008679号