我是靠谱客的博主 繁荣香烟,最近开发中收集的这篇文章主要介绍使用python+urllib爬取最受欢迎豆瓣影评信息,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

用网络爬虫爬取网站数据时,先尝试使用了最简单的方式,如果访问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 BeautifulSoup
import re
import urllib.request
from urllib.error import URLError
import xlwt
import pymysql
import 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="allstard+" title="(.+)"></span>')
#找到回应数
pattern_response=re.compile(r'<span class="">((d+)回应)</span>')
#找到有用数
pattern_use=re.compile(r'<em id="ucountd+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)

最后

以上就是繁荣香烟为你收集整理的使用python+urllib爬取最受欢迎豆瓣影评信息的全部内容,希望文章能够帮你解决使用python+urllib爬取最受欢迎豆瓣影评信息所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部