使用python+urllib爬取最受欢迎豆瓣影评信息
来源:互联网 发布:中英文域名注册 编辑:程序博客网 时间:2024/05/16 15:09
用网络爬虫爬取网站数据时,先尝试使用了最简单的方式,如果访问url失败,先考虑添加表头信息(User-Agent是最重要的信息),这样往往可以解决访问失败的问题。如果爬取过程中遭遇中断,往往是该网站的反爬虫机制检测到了你的网络爬虫,这时候考虑添加cookie,模拟登录等手段。使用requests第三方包比使用urllib更方便快捷,遇到的问题也会较少。如果添加cookie后问题依然解决不了,那就考虑使用自动化测试工具selenium来进行爬取,速度可能会慢点,但是效果应该会很好。这里需要注意使用requests和urllib时添加表头的方式。
# -*- coding: utf-8 -*-"""Created on Sun Dec 25 10:53:28 2016@author: Administrator"""#import sys#reload(sys)#sys.setdefaultencoding('utf8')from bs4 import BeautifulSoupimport reimport urllib.requestfrom urllib.error import URLErrorimport xlwtimport pymysqlimport mysql.connector#得到页面全部内容my_headers=["Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36","Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0""Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/537.75.14"]headers={'Host':'ptlogin2.qq.com', 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER' }def askURL(url): import random #randdom_header="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36" randdom_header=random.choice(my_headers) req = urllib.request.Request(url)#发送请求 req.add_header("User-Agent",randdom_header) req.add_header("Host","movie.douban.com") req.add_header("Referer","https://movie.douban.com/") req.add_header("GET",url) try: response = urllib.request.urlopen(req)#取得响应 html= response.read()#获取网页内容 #print(html) except URLError as e: if hasattr(e,"code"): print (e.code) if hasattr(e,"reason"): print (e.reason) return html#获取相关内容def getData(baseurl): """ #找到评论标题 pattern_title = re.compile(r'<a class="".+title-link="(.+)"') #找到评论全文链接 pattern_link = re.compile(r'<a class="".+href="(.+review.*?)"') #找到作者 pattern_author = re.compile(r'<a.+people.+">(.+)</a>') #找到评论的影片和影评详情链接 pattern_subject_link = re.compile(r'<a href="(.+subject.+)" title="(.+)">') #找到推荐等级 pattern_star=re.compile(r'<span class="allstar\d+" title="(.+)"></span>') #找到回应数 pattern_response=re.compile(r'<span class="">\((\d+)回应\)</span>') #找到有用数 pattern_use=re.compile(r'<em id="ucount\d+u">(\d+)</em>') remove=re.compile(r'<.+?>')#去除标签 """ datalist=[] for i in range(0,3):#总共5页 url=baseurl+str(i*10)#更新url html=askURL(url) soup = BeautifulSoup(html,'lxml') #找到每一个影评项 for item in soup.find_all('div',class_='main review-item'): data=[] title=item.find('a',class_="title-link").text #print (title) data.append(title)#添加标题 author=item.find('a',class_="author").find('span').text #print(author) data.append(author)#添加作者 moviename=item.find('a',class_="subject-title").text #print(moviename) movielink=item.find('a',class_="subject-title").get('href') #print(movielink) data.append(moviename)#添加片名 data.append(movielink)#添加影片链接 star=item.find('span',class_="main-title-rating").get('title') #print(star) data.append(star)#添加推荐等级 response=item.find("a",class_="pl") #回应数可能为0,就找不到 if(response!= None): response=response.text else: response=str(0) #print(response) data.append(response)#添加回应数 reviewlink=item.find('a',class_="title-link").get("href") data.append(reviewlink)#添加评论正文链接 content=askURL(reviewlink) content=BeautifulSoup(content,'lxml') use=item.find("div",class_="more-info pl clearfix") if use !=None: use=use.find("span").text.split("/")[0] else: use=str(0) #print(use) data.append(use)#添加有用数 remove=re.compile(r'<.+?>')#去除标签 desc=content.find_all('div',class_='review-content clearfix') desc=re.sub(remove,'',str(desc))#去掉标签 desc=desc.strip('[').strip(']').strip("\n").strip() print(desc) data.append(desc)#添加评论正文 datalist.append(data) return datalist#将相关数据写入excel中def saveData(datalist,savepath): book=xlwt.Workbook(encoding='utf-8',style_compression=0) sheet=book.add_sheet(u'豆瓣最受欢迎影评',cell_overwrite_ok=True) col=[u'标题',u'作者',u'影片名',u'影片详情链接',u'推荐级',u'回应数',u'影评链接',u'有用数',u'影评'] for i in range(0,9): print(i) sheet.write(0,i,col[i])#列名 for i in range(0,30):#总共50条影评 data=datalist[i] for j in range(0,9): #此处有问题,评论列插不进去,没找到原因何在 sheet.write(i+1,j,data[j])#数据 """ for i in range(0,30):#总共50条影评 data=datalist[i] sheet.write(i+1,8,data[8])#数据 """ book.save(savepath)#保存def connDB():#连接数据库函数 conn=mysql.connector.connect(user='root',passwd='123456',database='review',charset='utf8') cursor=conn.cursor() return(conn,cursor)def exitConn(conn,cursor): cursor.close() conn.close()def SaveMysql(datalist): conn,cursor=connDB(); cursor.execute('create table movie_review \ (title varchar(50) primary key,\ author varchar(20),\ moviename varchar(20),\ movielink varchar(100),\ star varchar(10),\ response varchar(10),\ reviewlink varchar(50),\ useful varchar(10),\ review varchar(8000))') for i in range(0,30): data=datalist[i] print('insert into movie_review values\ (%s,%s,%s,%s,%s,%s,%s,%s,%s)',[data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8]]) cursor.execute('insert into movie_review values\ (%s,%s,%s,%s,%s,%s,%s,%s,%s)',[data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8]]) conn.commit() exitConn(conn,cursor)if __name__=='__main__': baseurl='http://movie.douban.com/review/best/?start=' datalist=getData(baseurl) savepath='豆瓣最受欢迎影评.xls' SaveMysql(datalist) #saveData(datalist,savepath)
0 0
- 使用python+urllib爬取最受欢迎豆瓣影评信息
- 使用python爬取《长城》豆瓣影评
- Python 豆瓣影评抓取
- python爬虫(豆瓣影评)
- Python 简单爬虫 豆瓣热门影评
- python爬虫实战:《星球大战》豆瓣影评分析
- 使用requests爬取豆瓣《长城》影评
- 使用python抓取豆瓣电影信息
- 豆瓣最受欢迎的影评爬虫(第一个爬虫撒花!)
- Python 爬虫实践:《战狼2》豆瓣影评分析
- Python 爬虫实践:《战狼2》豆瓣影评分析
- python爬虫实战:分析豆瓣中最新电影的影评
- Python 爬虫实战:分析豆瓣中最新电影的影评
- python爬虫爬取豆瓣top250电影影评
- 豆瓣影评 盲山
- 豆瓣影评 高地战
- 辩护人 豆瓣影评
- 杀戮演绎 豆瓣影评
- 《机器学习实战》第三章 3.2在python 中使用matplotlib注解绘制树形图
- Linux学习笔记3 (用户和用户组管理)
- 组合数
- mysql innodb 独占表空间和共享表空间
- 107. Binary Tree Level Order Traversal II | 层次遍历顺序逆置输出
- 使用python+urllib爬取最受欢迎豆瓣影评信息
- Eclipse 项目导入Android Studio
- Perl执行shell命令的几种方式及其区别
- 遭遇“HTTP 错误 500.19 无法访问请求的页面,因为该页的相关配置数据无效。”处理
- S5PV210----裸机LCD驱动
- java文件的读写问题
- 11. Container With Most Water
- shell 脚本nginx日志分割
- AutoLayout android studio