美文网首页编程学习Python开发程序员
python爬虫之爬取豆瓣top250图书信息

python爬虫之爬取豆瓣top250图书信息

作者: I_am_Eko | 来源:发表于2017-03-28 23:44 被阅读1420次

    先上代码:

    import requests
    from bs4 import BeautifulSoup
    import time
    
    class top250books():
        def html(self, href):
            max_span = 225
            for page in range(0, int(max_span), 25):
                page_url = href + '?start=' + str(page)
                self.parse(page_url)
    
        def parse(self, url):
            html = self.request(url)
            all_tables = BeautifulSoup(html.text, 'lxml').find('div',  class_='indent').find_all('table')
            for table in all_tables:
                time.sleep(0.5)
                title = table.find('div', class_='pl2').find('a').get_text()
                info = table.find('p', class_='pl').get_text()
                rating_nums = table.find('span', class_='rating_nums').get_text()
                rating_people = table.find('span', class_='pl').get_text()
                quote = table.find('span', class_='inq').get_text()
                f = open('test.txt', 'ab')
                f.write(("".join(title.split()) + " ").encode('utf-8'))
                f.write(("".join(info.split()) + " ").encode('utf-8'))
                f.write(("".join(rating_nums.split()) + " ").encode('utf-8'))
                f.write(("".join(rating_people.split()) + " ").encode('utf-8'))
                f.write(("".join(quote.split()) + " " + '\n').encode('utf-8'))
                f.close()
                print("".join(title.split()))
    
        def request(self, url):
            headers = { 'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/602.4.8 (KHTML, like Gecko) Version/10.0.3 Safari/602.4.8"}
            content = requests.get(url, headers=headers)
            return content
    
    books = top250books()
    books.html('https://book.douban.com/top250')
    

    下面是爬取的部分内容:

    追风筝的人 [美]卡勒德·胡赛尼/李继宏/上海人民出版社/2006-5/29.00元 8.8 (260575人评价) 为你,千千万万遍 
    小王子 [法]圣埃克苏佩里/马振聘/人民文学出版社/2003-8/22.00元 9.0 (215493人评价) 献给长成了大人的孩子们 
    围城 钱锺书/人民文学出版社/1991-2/19.00 8.9 (182470人评价) 对于“人艰不拆”四个字最彻底的违抗 
    活着 余华/南海出版公司/1998-5/12.00元 9.1 (123542人评价) 活着本身就是人生最大的意义 
    解忧杂货店 [日]东野圭吾/李盈春/南海出版公司/2014-5/39.50元 8.6 (190788人评价) 一碗精心熬制的东野牌鸡汤,拒绝很难 
    白夜行 [日]东野圭吾/刘姿君/南海出版公司/2008-9/29.80元 9.1 (179501人评价) 暗夜独行的残破灵魂,爱与恶本就难分难舍 
    挪威的森林 [日]村上春树/林少华/上海译文出版社/2001-2/18.80元 8.0 (180870人评价) 村上之发轫,多少人的青春启蒙 
    不能承受的生命之轻 [捷克]米兰·昆德拉/许钧/上海译文出版社/2003-7/23.00元 8.5 (131418人评价) 朝向媚俗的一次伟大的进军 
    三体:“地球往事”三部曲之一 刘慈欣/重庆出版社/2008-1/23.00 8.8 (130765人评价) 你我不过都是虫子 
    嫌疑人X的献身 [日]东野圭吾/刘子倩/南海出版公司/2008-9/28.00 8.9 (126724人评价) 数学好是一种极致的浪漫 
    红楼梦 [清]曹雪芹著/人民文学出版社/1996-12/59.70元 9.5 (115203人评价) 谁解其中味?
    

    ​初学爬虫,代码写的很粗糙,很多地方还可以优化,其实一直感觉拿不出手,但是谁没有开始呢,还请大家多多指教。关于python的爬虫网上的教程有很多,这里用到的技术,我会给出学习链接,要比我讲的好多了,大家可以去参考学习,爬虫教程-知乎


    ​这里主要写一下自己在写爬虫的过程中遇到的问题及解决办法:

    ​1.网上的教程大多是python2.x,我用的是python3.5python2.x语法和库上有很多不一样:比如import urllib2变成了import urllib.request等等此类变化很多。我觉得新的版本是未来,所以选择用新的。如果你为了学起来方便也可以用2.x的版本,如果想看看这些差别,可以看这篇文章 Python 2.7.x 和 3.x 版本的重要区别

    ​2.还有一个是关于字符集的问题,这应该是个很简单的问题,我却花了好久才彻底搞懂,这就是计算机基础不扎实的后果啊。首先关于字符集和字符编码,可以参考这篇文章:字符集和字符编码。了解这些之后可以再去了解python里面的encodedecode,可以参考这篇文章:python字符串的encode和decode研究心得

    ​3.是关于如何应对网站的反爬虫策略,第一次运行代码,看见书名一行一行的在终端打印出来,高兴的不行。第二次写好代码,准备把书的信息写入文本的时候,却发现打不开网站了,手机端,浏览器都不行。提示有异常请求从我的ip发出,请登陆后使用。我才意识到ip被封了,我又去搜索了一下,才知道豆瓣对请求的频率有限制。像识别User-Agent这种基本的反爬虫策略,几乎所有网站都有,频率限制是一些特别的网站才有。当时我真是觉得又激动又觉得很有意思,有种偷偷做坏事的感觉。过了两天,我发现,豆瓣又解禁了ip,我这次吸取经验,每请求一次,我都让程序sleep0.5s。这样它就发现不了了,不过速度是真的慢。还有一种代价比较高的方法是买很多代理ip,打一枪换一个地方。


    写在最后:

    关于爬虫要学习的还有很多,因为毕设要用到微博数据,所以要爬去微博数据,下个目标就是要能模拟登陆新浪微博。写代码真是太有意思了!嘿嘿。

    相关文章

      网友评论

      • 害虫_4673:感谢这篇文章,让我有所收获,不过代码里有错误,比如爬取的时候书没有评价怎么办,这里需要做一下判断

      本文标题:python爬虫之爬取豆瓣top250图书信息

      本文链接:https://www.haomeiwen.com/subject/yypsottx.html