先上代码:
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.5
与python2.x
语法和库上有很多不一样:比如import urllib2
变成了import urllib.request
等等此类变化很多。我觉得新的版本是未来,所以选择用新的。如果你为了学起来方便也可以用2.x的版本,如果想看看这些差别,可以看这篇文章 Python 2.7.x 和 3.x 版本的重要区别。
2.还有一个是关于字符集的问题,这应该是个很简单的问题,我却花了好久才彻底搞懂,这就是计算机基础不扎实的后果啊。首先关于字符集和字符编码,可以参考这篇文章:字符集和字符编码。了解这些之后可以再去了解python
里面的encode
和decode
,可以参考这篇文章:python字符串的encode和decode研究心得。
3.是关于如何应对网站的反爬虫策略,第一次运行代码,看见书名一行一行的在终端打印出来,高兴的不行。第二次写好代码,准备把书的信息写入文本的时候,却发现打不开网站了,手机端,浏览器都不行。提示有异常请求从我的ip发出,请登陆后使用。我才意识到ip被封了,我又去搜索了一下,才知道豆瓣对请求的频率有限制。像识别User-Agent
这种基本的反爬虫策略,几乎所有网站都有,频率限制是一些特别的网站才有。当时我真是觉得又激动又觉得很有意思,有种偷偷做坏事的感觉。过了两天,我发现,豆瓣又解禁了ip,我这次吸取经验,每请求一次,我都让程序sleep0.5s
。这样它就发现不了了,不过速度是真的慢。还有一种代价比较高的方法是买很多代理ip,打一枪换一个地方。
写在最后:
关于爬虫要学习的还有很多,因为毕设要用到微博数据,所以要爬去微博数据,下个目标就是要能模拟登陆新浪微博。写代码真是太有意思了!嘿嘿。