使用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
原创粉丝点击