作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3159


可以用pandas读出之前保存的数据:

newsdf = pd.read_csv(r'F:\duym\gzccnews.csv')

 截图:

一.把爬取的内容保存到数据库sqlite3

import sqlite3
with sqlite3.connect('gzccnewsdb.sqlite') as db:
newsdf.to_sql('gzccnews',con = db)

with sqlite3.connect('gzccnewsdb.sqlite') as db:
df2 = pd.read_sql_query('SELECT * FROM gzccnews',con=db)

import sqlite3
with sqlite3.connect('gzccnewsdb.sqlite') as db:newsdf.to_sql('gzccnewsdb',con = db)
with sqlite3.connect('gzccnewsdb.sqlite') as db:df2 = pd.read_sql_query('SELECT * FROM gzccnewsdb',con=db)
df2

 效果截图:

保存到MySQL数据库

  • import pandas as pd
  • import pymysql
  • from sqlalchemy import create_engine
  • conInfo = "mysql+pymysql://user:passwd@host:port/gzccnews?charset=utf8"
  • engine = create_engine(conInfo,encoding='utf-8')
  • df = pd.DataFrame(allnews)
  • df.to_sql(name = ‘news', con = engine, if_exists = 'append', index = False)
import pymysql
from sqlalchemy import create_engine
coninfo='mysql+pymysql://root:@localhost:3306/gzccnews?charset=utf8'
engine=create_engine(coninfo,encoding='utf-8')newsdf.to_sql(name='news',con = coninfo,if_exists='append',index=False)
conn=pymysql.connect(host='localhost',port=3306,user='root',passwd='',db='gzccnews',charset='utf8')xiaoguo 

效果截图:

二.爬虫综合大作业

  1. 选择一个热点或者你感兴趣的主题。
  2. 选择爬取的对象与范围。
  3. 了解爬取对象的限制与约束。
  4. 爬取相应内容。
  5. 做数据分析与文本分析。
  6. 形成一篇文章,有说明、技术要点、有数据、有数据分析图形化展示与说明、文本分析图形化展示与说明。
  7. 文章公开发布。

本次作业主题是爬取中国豆瓣影评战狼2:https://movie.douban.com/subject/26363254/

       吴京主导的战狼系列之战狼3正在火热拍摄中,战狼粉丝们也在期许中。回顾战狼系列曾经战狼2拍摄是“负资累累”才拍摄完毕,但是成果也是巨大的。《战狼2》是中国电影界第一部走出去的电影,也是中国第一部跻身全球票房100强的中国电影。网上论坛对战狼2的影评也是议论纷纷,有好的,有坏的。下面小编就爬取豆瓣网战狼2的影评信息来了解战狼2粉丝的评论。

1.获取豆瓣网url

https://movie.douban.com/subject/26363254/comments/start=20&limit=20&sort=new_score\&status=P&percent_type=''&comments_only=1

  • id # ID
  • username# 用户名
  • user_center # 用户主页链接
  • vote # 赞同这条评论的人数
  • star # 开始爬取的条数
  • time # 时间
  • content # 评论

对数据进行爬取:

# 构造函数def __init__(self, movie_id, start, type=''):''':type: 评论:movie_id: 影片的ID号:start: 开始的记录数,0-480'''self.movie_id = movie_idself.start = startself.type = typeself.url = 'https://movie.douban.com/subject/{id}/comments?start={start}&limit=20&sort=new_score\&status=P&percent_type={type}&comments_only=1'.format(id=str(self.movie_id),start=str(self.start),type=self.type)# 创建数据库连接self.session = create_session() f _get(self):self._random_UA()  # 调用随机产生的User-Agentres = ''  # res定义字符串# 获取网页信息并爬取try:res = requests.get(self.url, cookies=self.cookies, headers=self.headers,proxies=self.proxies)time.sleep(random.random() * 3)res = res.json()['html']# 返回的数据为json数据,需要提取里面的HTMLexcept Exception as e:print('IP被封,请使用代理IP')print('正在获取{} 开始的记录'.format(self.start))return res

对数据进行整理:

def _parse(self):res = self._get()dom = etree.HTML(res)# id号self.id = dom.xpath(self.base_node + '/@data-cid')# 用户名 所有div节点下class名叫avatar的节点下面的a标签self.username = dom.xpath(self.base_node + '/div[@class="avatar"]/a/@title')# 用户连接self.user_center = dom.xpath(self.base_node + '/div[@class="avatar"]/a/@href')# 点赞数self.vote = dom.xpath(self.base_node + '//span[@class="votes"]/text()')# 评分self.star = dom.xpath(self.base_node + '//span[contains(@class,"rating")]/@title')# 发表时间self.time = dom.xpath(self.base_node + '//span[@class="comment-time "]/@title')# 评论内容 所有span标签class名为short的节点文本self.content = dom.xpath(self.base_node + '//span[@class="short"]/text()')if __name__ == '__main__':# [综合评论、好评、中评、差评]for i in ['', 'h', 'm', 'l']:# 最多爬取24页for j in range(1,30):fetcher = CommentFetcher(movie_id=26363254, start=j * 20, type=i)

数据截图:

  • 通过xpath函数解析html文本,增加爬取效率

2. 使用代理IP

IP =[" http://10.10.1.10:3128"," http://10.10.1.10:1080","http://110.88.126.70"]#随机调用代理IPdef _random_IP(self):self.proxies["http:"] = random.choice(IP)

  由于爬取数据比较多,为防止豆瓣网监控封取IP,故使用代理IP.(由于这些IP都是西刺网上的免费的代理IP,故有效时长不长获取的数据也不完整)

3.在SQL创建表

from sqlalchemy import Column, String, create_engine, Integer, Text, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker# 初始化数据库连接
engine = create_engine('mysql+pymysql://root:123456@127.0.0.1:3306/douban?charset=utf8')
Base = declarative_base()class Comments(Base):__tablename__ = 'test'id = Column(Integer, primary_key=True)   # IDusername = Column(String(64), nullable=False, index=True)   # 用户名user_center = Column(String(64), nullable=True)   # 用户主页链接vote = Column(Integer, nullable=True)   # 赞同这条评论的人数star = Column(String(10), nullable=True)  # 开始爬取的条数time = Column(DateTime, nullable=True)   # 时间content = Column(Text(), nullable=False, index=True)  # 评论def create_session():# 创建DBSession类型:Session = sessionmaker(bind=engine)session = Session()return sessionif __name__ == '__main__':#创建数据表Base.metadata.create_all(engine)

  4.使用jieba进行中文过滤

import pandas as pd
from wordcloud import WordCloud
import jieba
import matplotlib.pyplot as plt
import PIL.Image as image
import numpy as nptxt = open(r'G:\aa\zhanlang2.txt', 'r', encoding='utf8').read()  # 打开评论数据
jieba.load_userdict(r'G:\aa\ZL2.txt')  # 读取战狼2词库Filess= open(r'G:\aa\stops_chinese.txt', 'r', encoding='utf8')  # 打开中文停用词表
stops = Filess.read().split('\n')  # 以回车键作为标识符把停用词表放到stops列表中wordsls = jieba.lcut(txt)  # 使用jieba中文分词组件
wcdict = {}tokens=[token for token in wordsls if token not in stops]
print("过滤后中文内容对比:",len(tokens), len(wordsls))# 统计词频次数
for word in tokens:if len(word) == 1:continueelse:wcdict[word] = wcdict.get(word, 0) + 1# 词频排序
wcls = list(wcdict.items())
wcls.sort(key=lambda x: x[1], reverse=True)# 打印前30词频最高的中文
for i in range(20):print(wcls[i])# 存储过滤后的文本
pd.DataFrame(wcls).to_csv('2.csv', encoding='utf-8')# 读取csv词云
txt = open('2.csv', 'r', encoding='utf-8').read()# 用空格键隔开文本并把它弄进列表中
cut_text = "".join(jieba.lcut(txt))mywc = WordCloud().generate(cut_text)plt.imshow(mywc)
plt.axis("off")
plt.show()

  • 根据jieba分词后词频统计前20可以看出,这部片是吴京主演。根据“国家”与“爱国”两个字可以推测的出剧情有爱国表现,以及国家与国家的对抗的。“坦克”也可以看的战争情景震撼。“好看”一词也表达了观众对这部影评大体来说是满意的。

5.评分等级

import matplotlib
import matplotlib.pyplot as plt#显示中文
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False
#631137
alt=[124965,215218,198808,56171,35975]
index='力荐', '推荐', '还行', '较差','很差'
plt.axes(aspect=1)
plt.pie(x=alt,labels=index,autopct='%.0f%%')
plt.show()

  • 由图形表可以看出80%以上的人看影片都觉得不错。仅15%左右的小伙伴可能觉得对这部影片期许度过高导致对这部影片不理想吧。

6.总结

在这次爬取过程中得到了许多,遇到的困难也比较多。由于爬取的数据量比较大,豆瓣识别IP并封停IP号。随后我尝试使用免费的代理IP号进行数据的爬取,为了再一次被封IP,我每一次爬取时间随机间隔爬取,以及使用代理IP随机爬取故而爬取效率变得很低,并且爬取是单线程爬取,爬取效率也是十分的低。

在第二次想要爬取用户地理位置时,由于访问次数太多。豆瓣系统识别我的IP,并且把我的账号永久封号故而无法再进一步爬取地理数据。网上的代理免费的代理IP也失效了,问题随着知识的增长每一次都会发现新的问题,我相信经过自己不断汲取知识,争取爬取整个豆瓣的详细数据。

转载于:https://www.cnblogs.com/JGaoLin/p/10775536.html

菜鸟学IT之豆瓣爬取初体验相关推荐

  1. xhr get获取文件流下载文件_python爬虫实战——豆瓣电影get初体验

    影评许可证 公众号[2019]第22期 本栏目由"数据皮皮侠"独家呈献 专场 python爬虫实战--豆瓣电影get初体验 2019.10.28 / 早上7点场 / 免费 本期&q ...

  2. python爬取音乐_Python现学现用xpath爬取豆瓣音乐

    昨天说了Requests库,今天来上手爬虫了. 爬虫的抓取方式有好几种,正则表达式,Lxml(xpath)与BeautifulSoup,我在网上查了一下资料,了解到三者之间的使用难度与性能 三种爬虫方 ...

  3. Python爬虫:现学现用xpath爬取豆瓣音乐

    爬虫的抓取方式有好几种,正则表达式,Lxml(xpath)与BeautifulSoup,我在网上查了一下资料,了解到三者之间的使用难度与性能 三种爬虫方式的对比. 这样一比较我我选择了Lxml(xpa ...

  4. 小菜鸟的第一个爬虫:豆瓣爬取电影信息

    爬取页面: [2016年国内公映电影排期] #!/usr/bin/env python # -*- coding=utf-8 -*-import urllib.request import re im ...

  5. python爬虫小案例_从豆瓣爬取《哪吒之魔童降世》的剧照

    一.在豆瓣电影网爬取以下剧照保存到本地: 本次案例只爬取前 5 页的剧照,先获取前五页的链接: for i in range(5):url = 'https://movie.douban.com/su ...

  6. python爬虫-豆瓣爬取数据保存为html文件

    接<python爬虫-豆瓣数据爬取-正则匹配>中的案例五,将爬取的豆瓣租房信息网址和标题保存为html文件. 脚本修改如下: # -*-coding:utf-8 -*- import re ...

  7. 爬虫|菜鸟的学习之路——爬取一本小说

    前言:本次爬取的是全书网的某一本小说并以.TXT格式下载到本地. 工具:python3 和 pycharm Python库:urllib.request 和 re 注意:python是用3以上的版本, ...

  8. mysql 豆瓣,爬取豆瓣电影Top250并存入Mysql

    最近使用scrapy爬取了豆瓣电影Top250的数据和图片保存到Mysql,给大家分享一下 创建scrapy startproject doubantop250 items.py class Doub ...

  9. crawler碎碎念5 豆瓣爬取操作之登录练习

    import requestsimport html5libimport refrom bs4 import BeautifulSoups = requests.Session() #这里要提一点,就 ...

最新文章

  1. 小块头大性能才能得到用户的青睐
  2. 团队软件库_新环节!新设备!新软件! ——天津市物流大赛创新大揭秘!
  3. python考研成绩什么时候出来_这里有最新的调剂、成绩公布时间以及复试信息
  4. 1.4.2 solr字段类型--(1.4.2.4)使用Dates(日期)
  5. Linux系统管理-(12)-网络配置IP命令
  6. 编写c语言程序的可视化编程环境有哪些,C语言可视化编程环境设计及实现.pdf
  7. css3如何链如外部字体,微信小程序引入外部字体总结(针对安卓加载缓慢问题)...
  8. 白盒测试之基本路径测试法
  9. 《移动通信原理与系统》——第二章《移动通信电波传播与传播预测模型》——笔记
  10. Ubuntu16.04 使用小米WiFi 变无线网卡
  11. 车牌号对应归属地及城市JSON带简码
  12. JS中什么是回调函数?
  13. 定时任务:数据表设计与实现方案
  14. 一文说明白ECDSA spec256k1 spec256r1 EdDSA ed25519千丝万缕的关系
  15. 在HTML中 怎么一张图片上在放一张图片,css sprites把很多小图集成在一张图片上...
  16. 桌面运维之windows部分常用命令
  17. android+路由器+名称,路由器默认wifi名称是什么?
  18. 身份证号码组件:lt;idcardgt; —— 快应用组件库H-UI
  19. java annotation class,Java Class类 isAnnotation()方法及示例
  20. 公交来了 1.3.0 发布

热门文章

  1. GIF 格式解析之表情包是如何动起来的
  2. 海尔会成为最大的智联网企业么?
  3. CredSSP加密Oracle修正 解决方法
  4. 【软件测试学习】禅道工具使用
  5. Surface高分辨率下很多软件工具栏字体和按钮太小的解决方案
  6. 2019上半年中小学教资考试教育知识与能力试题(中学)——主观题
  7. IoT黑板报:中移动净利润是电信联通总和6倍
  8. 基于Uniapp+SpringBoot实现微信小程序授权登录
  9. 程维柳青道歉:非常悲痛和自责 要以安全作为核心考核指标
  10. 使用QImage进行高质量绘制(High-Quality Rendering with QImage)