作业来源: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_id
self.start = start
self.type = type
self.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-Agent
res = '' # 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数据,需要提取里面的HTML
except 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"] #随机调用代理IP
def _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) # ID
username = 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 session if __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 np txt = 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:
continue
else:
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也失效了,问题随着知识的增长每一次都会发现新的问题,我相信经过自己不断汲取知识,争取爬取整个豆瓣的详细数据。

菜鸟学IT之豆瓣爬取初体验的更多相关文章

  1. 菜鸟学IT之python网页爬取初体验

    作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2881 1. 简单说明爬虫原理 爬虫简单来说就是通过程序模拟浏览器放松请求站 ...

  2. 菜鸟学IT之python词云初体验

    作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2822 1. 下载一长篇中文小说. 2. 从文件读取待分析文本. txt = ...

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

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

  4. python学习(七)--豆瓣爬取电影名,评分以及演员

    import requestsimport re #爬取豆瓣电影排名pageNum = int(input("要查看第几页电影分数:"))#已知豆瓣默认每页展示20条#url= & ...

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

    import requests import html5lib import re from bs4 import BeautifulSoup s = requests.Session() #这里要提 ...

  6. 菜鸟学python之大数据的初认识

    这次作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2639 1.这些分析所采用数据来源是什么? 国家数据库:中国铁路 ...

  7. crawler碎碎念6 豆瓣爬取操作之获取数据

    import requests from lxml import etree s = requests.Session() for id in range(0,251,25): url ='https ...

  8. Scrapy 通过登录的方式爬取豆瓣影评数据

    Scrapy 通过登录的方式爬取豆瓣影评数据 爬虫 Scrapy 豆瓣 Fly 由于需要爬取影评数据在来做分析,就选择了豆瓣影评来抓取数据,工具使用的是Scrapy工具来实现.scrapy工具使用起来 ...

  9. python爬虫实践(二)——爬取张艺谋导演的电影《影》的豆瓣影评并进行简单分析

    学了爬虫之后,都只是爬取一些简单的小页面,觉得没意思,所以我现在准备爬取一下豆瓣上张艺谋导演的“影”的短评,存入数据库,并进行简单的分析和数据可视化,因为用到的只是比较多,所以写一篇博客当做笔记. 第 ...

随机推荐

  1. 图解HTTP(一)

    第一章 了解Web及网络基础 1.为知识共享为规划Web,基本理念是:借助多文档之间相互关联(你中有我,我中有你)形成的超文本,连成客户想参阅的WWW(World Wide Web). 2.提出了3项 ...

  2. 使用Mimikatz读取密码

    法一: https://github.com/gentilkiwi/mimikatz/releases/tag/2.1.1-20170813 第一条:privilege::debug //提升权限 第 ...

  3. Android开发常用开源框架:图片处理

    https://blog.csdn.net/SGQ_CSDN/article/details/79910709 Android开发常用开源框架:图片处理 框架名称 功能描述 Android Unive ...

  4. leetcode 学习心得 (3)

    源代码地址:https://github.com/hopebo/hopelee 语言:C++ 517. Super Washing Machines You have n super washing ...

  5. 【RAC】 RAC For W2K8R2 安装--结尾篇(十)

    [RAC] RAC For W2K8R2 安装--结尾篇(十) 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其 ...

  6. Python学习日记(三十二) hmac检验客户端的合法性和socketsever模块

    Hmac模块 其实这个模块类似hashlib模块,它能将一些重要的信息通过算法加密成密文,让信息更具有安全性. 关于hmac加密算法的了解:它的全名是哈希运算消息认证码(Hash-based Mess ...

  7. 自已编译openweb docker image笔记

    1.基于https://github.com/jketterl/openwebrx git clone https://github.com/jketterl/openwebrx.git 2.首先创建 ...

  8. An exception has occurred, use %tb to see the full traceback.----parser.parse_args()报错

    一.报错: 原因: 由于在jupyter notebook中,args不为空. 二.问题解决 改成args = parser.parse_args(args=[])

  9. P3193 [HNOI2008]GT考试(KMP+矩阵乘法加速dp)

    P3193 [HNOI2008]GT考试 思路: 设\(dp(i,j)\)为\(N\)位数从高到低第\(i\)位时,不吉利数字在第\(j\)位时的情况总数,那么转移方程就为: \[dp(i,j)=dp ...

  10. python笔记40-环境迁移freeze生成requirements.txt

    前言 我们用python在本地电脑上开发完成一个python自动化项目用例,或者开发完成一个django项目. 需要部署到另外一台电脑或者服务器上的时候,需要导入python相关的依赖包,可以用fre ...