赞
踩
最近在跟HNU的学弟学妹交流时,了解到学校课程“计算与人工智能概论”(非计算机专业必修课)课程大作业是写一个爬虫来爬取数据进行可视化分析,感觉难度有点高就帮学弟学妹打个草稿,同时也是自己在学习的一个过程,这一个是岳麓书院计概的课程要求(应该文科都是这个),相对比较简单,帮助大家提供参考。(谁家好人给文科生出爬虫题啊)
网上资源太多太杂,错误的太多,大部分涉及到SQL,这一个相对比较简单,只需要python和jupyter就够了,会将最终数据存储到csv文件,如果是Hnu的同学,没有用过jupyter,可以通过老师让统一下载的Anaconda进行调用。其他的朋友的建议是Pycharm(吹爆),比spyder好看n倍,添加库之类的操作也会更简单。
废话少说正文开始:
相对来说题目二是比较简单的,只需要写个爬虫,爬几百条数据,再画个图就好了;题目一的话,爬本小说,用python的jieba库统计下人名,再用pyecharts绘制树形图,词云图就可以,但是情感分析这部分没有接触过,不知道怎么处理。
为了方便大家copy再创作我会把完整代码放在最后。
- import random
- import requests
- import parsel
- import csv
- import time
如何添加库请大家自行查询,这部分一定有耐心,因为下载失败可能有多种原因:
url = f'https://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-1'#爬取的目标网址,此网址是当当网近七日热销书籍第一页
把想要爬取的网址,赋值给url
- headers["X-Forwarded-For"] = "%s.%s.%s.%s" % (
- random.randrange(1, 200, 20), random.randrange(1, 200, 20), random.randrange(1, 200, 20),
- random.randrange(1, 200, 20))
- #这三行代码是用来更换ip地址,防止访问过于频繁被拦截,当当网比链家要难爬取一点
- headers = {
- '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'
- }#编写头,用来模拟访问
- response = requests.get(url=url,headers=headers)
- #向指定服务器发送get请求,返回Response对象,这个Response对象返回包含了整个服务器的资源。
- selector = parsel.Selector(response.text)
- #parsel这个库可以解析HTML和XML,并支持使用Xpath和CSS选择器对内容进行提取和修改,同时还融合了正则表达式的提取功能。parsel灵活且强大,同时也是python最流行的爬虫框架Scrapy的底层支持
- #创建一个selector对象,向其传入text参数,内容就是上面的url字符串。
- #有了这个selector对象之后,我们可以使用css和xpath方法分别传入css选择器和xpath进行内容提取
headers使用开发者工具查看的,不会的同学可以自己去看一下,这部分也是比较麻烦的一部分,如何获取自己需要的信息,在后面都要用到
- lis = selector.css('ul.bang_list li')
- for li in lis:
- title = li.css('.name a::attr(title)').get()
- if title:
- try:
- href = li.css('.name a::attr(href)').get()
- comment = li.css('.star a::text').get().replace("条评论",'')
- recommend = li.css('.tuijian::text').get().replace('推荐','')
- author = li.css('div:nth-child(5) a::text').get()
- date = li.css('div:nth-child(6) span::text').get()
- publishingHouse = li.css('div:nth-child(6) a::text').get()
- price_n = li.css('.price p:nth-child(1) .price_n::text').get()
- price_r = li.css('.price p:nth-child(1) .price_r::text').get()
- price_s = li.css('.price p:nth-child(1) .price_s::text').get()
- price_e = li.css('.price p:nth-child(2) .price_n::text').get()
- dit = {
- '标题': title,
- '评论': comment,
- '推荐': recommend,
- '作者': author,
- '出版日期': date,
- '出版社': publishingHouse,
- '售价': price_n,
- '原价': price_r,
- '折扣': price_s,
- '电子书': price_e,
- '详情页': href,
- }
- except:
- pass
这个只符合我现在传入的网址的即当当网近七日热销书籍,不同的网页的li节点也不同,大家请根据自己要爬取的网页自行查看并更改
- f = open('书籍data.csv',mode='a',encoding='utf-8',newline="")
- csv_write = csv.DictWriter(f,fieldnames=['标题','评论','推荐','作者','出版日期','出版社','售价','原价','折扣','电子书', '详情页'])
- csv_write.writeheader()#写入列表头
这个csv文件会出现你撰写的python文件的位置
- for page in range(1,26):
- time.sleep(1)#防止过快被拦截
- url = f'https://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-{page}'#爬取的目标网址,此网址是当当网近七日热销书籍 “{page}” 对应的是第几页
完整代码事例
- import random
- import requests
- import parsel
- import csv
- import time
- f = open('书籍data.csv',mode='a',encoding='utf-8',newline="")
- csv_write = csv.DictWriter(f,fieldnames=['标题','评论','推荐','作者','出版日期','出版社','售价','原价','折扣','电子书', '详情页'])
- csv_write.writeheader()
- for page in range(1,26):
- time.sleep(2)
- url = f'https://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-{page}'#爬取的目标网址,此网址是当当网近七日热销书籍 “{page}” 对应的是第几页
-
- headers = {
- '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'
- }#编写头,用来模拟访问
-
- headers["X-Forwarded-For"] = "%s.%s.%s.%s" % (
- random.randrange(1, 200, 20), random.randrange(1, 200, 20), random.randrange(1, 200, 20),
- random.randrange(1, 200, 20))
- #这三行代码是用来更换ip地址,防止访问过于频繁被拦截,当当网比链家要难爬取一点
-
- response = requests.get(url=url,headers=headers)
- #向指定服务器发送get请求,返回Response对象,这个Response对象返回包含了整个服务器的资源。
- selector = parsel.Selector(response.text)
- #parsel这个库可以解析HTML和XML,并支持使用Xpath和CSS选择器对内容进行提取和修改,同时还融合了正则表达式的提取功能。parsel灵活且强大,同时也是python最流行的爬虫框架Scrapy的底层支持
- #创建一个selector对象,向其传入text参数,内容就是上面的url字符串。
- #有了这个selector对象之后,我们可以使用css和xpath方法分别传入css选择器和xpath进行内容提取
- lis = selector.css('ul.bang_list li')
- for li in lis:
- title = li.css('.name a::attr(title)').get()
- if title:
- try:
- href = li.css('.name a::attr(href)').get()
- comment = li.css('.star a::text').get().replace("条评论",'')
- recommend = li.css('.tuijian::text').get().replace('推荐','')
- author = li.css('div:nth-child(5) a::text').get()
- date = li.css('div:nth-child(6) span::text').get()
- publishingHouse = li.css('div:nth-child(6) a::text').get()
- price_n = li.css('.price p:nth-child(1) .price_n::text').get()
- price_r = li.css('.price p:nth-child(1) .price_r::text').get()
- price_s = li.css('.price p:nth-child(1) .price_s::text').get()
- price_e = li.css('.price p:nth-child(2) .price_n::text').get()
- dit = {
- '标题': title,
- '评论': comment,
- '推荐': recommend,
- '作者': author,
- '出版日期': date,
- '出版社': publishingHouse,
- '售价': price_n,
- '原价': price_r,
- '折扣': price_s,
- '电子书': price_e,
- '详情页': href,
- }
- csv_write.writerow(dit)
- except:
- pass
总结:
感受到了文字的在传输知识上面的一些局限性,如果要爬取别的网址的数据的话,不建议改我的,因为太蛮烦了!!!代码前后是联系在一起的大家如果要应付老师作业的话还是直接抄把。可视化在下一节,大家可以去看专栏。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。