Python爬虫之利用BeautifulSoup爬取豆瓣小说(一)——设置代理IP
自己写了一个爬虫爬取豆瓣小说,后来为了应对请求不到数据,增加了请求的头部信息headers,为了应对豆瓣服务器的反爬虫机制:防止请求频率过快而造成“403 forbidden”,乃至封禁本机ip的情况,而设置了代理ip,详细请见代码和注释。
爬取豆瓣小说的链接:https://www.douban.com/tag/%E5%B0%8F%E8%AF%B4/book?start=0
获取免费代理ip的网站:http://www.xicidaili.com/
#-*-coding:utf-8-*-
import urllib2
from bs4 import BeautifulSoup
import time
import random
class dbxs:
def __init__(self):
self.pageIndex = 0
self.enable = True
#获取html页面的内容
def getPage(self, pageIndex):
try:
#设置代理ip
enable_proxy = True
#Openers使用处理器Handlers,所有的“繁重”工作由Handlers处理,每个handlers知道如何通过特定协议打开URLs,或者如何处理URL打开时的各个方面
#在你使用代理上网或其他的情况就需要自己创建一个opener,可以实例化一个OpenerDirector,然后调用.add_handler(some_handler_instance)
#也可使用build_opener,这是一个更加方便的函数,用来创建opener对象,它只需要一次函数调用
proxy_handler = urllib2.ProxyHandler({'Http': '113.118.170.230:808'})
null_proxy_handler = urllib2.ProxyHandler({})
if enable_proxy:
#当你获取一个URL你要使用一个opener,默认情况下opener是urlopen,但urllib2.urlopen()不支持验证、cookie或者其他Http高级功能
#要支持这些功能,必须使用build_opener()创建自定义opener对象,build_opener([handler1 [handler2,...]]),参数handler是Handlers的实例,常用的有HTTPBasicAuthHandler、HTTPCookieProcessor、ProxyHandler
opener = urllib2.build_opener(proxy_handler)
else:
opener = urllib2.build_opener(null_proxy_handler)
urllib2.install_opener(opener) #install_opener用来创建(全局)默认opener,这个表示调用urlopen将使用你安装的opener
#获得页面响应的内容
url = 'https://www.douban.com/tag/%E5%B0%8F%E8%AF%B4/book' + "?start=" + str(pageIndex)
#设置请求头部信息,模拟浏览器的行为
my_headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:55.0)'}
request = urllib2.Request(url, headers = my_headers)
response = urllib2.urlopen(request)
return response.read()
#另外一种随机设置请求头部信息的方法
#my_headers =['Mozilla/5.0 (Windows NT 6.1; WOW64; rv:55.0)', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)', 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0)']
#header = random.choice(my_headers) #random.choice()可以从任何序列,比如list列表中,选取一个随机的元素返回,可以用于字符串、列表、元组
#request = urllib2.Request(url, headers = {'User-Agent': header})
except urllib2.URLError, e:
if hasattr(e, "code"):
print e.code
if hasattr(e, "reason"):
print e.reason
return None
#过滤查找这一页的小说名字,信息和评分
def getContent(self, pageIndex):
pageCode = self.getPage(pageIndex)
soup = BeautifulSoup(pageCode, 'html.parser')
#在获得相应的内容中找出所有标签为<dd>的内容(里面包含了我们需要的小说信息)
contents = soup.find_all('dd')
#如果contents为真,能够获取到包含<dd>标签的内容,什么情况获取不到?我们发现豆瓣小说21页之后的所有页面里都不包含<dd>标签,我们应该停止打印
if contents:
#item为包含小说信息的每一页的内容
for item in contents:
title = item.find(class_ = 'title').string
info = item.find(class_ = 'desc').string.strip()
rate = item.find(class_ = 'rating_nums')
#通过试验,我们发现某一页可能存在小说没有评分,如果我们不判断rate,那么可能就出现报错
if rate:
rates = rate.string
print u"%s\n%s\n评分:%s\n" %(title, info, rates)
#对于小说没有评分的内容,我们只打印小说名字,信息
else:
print u"%s\n%s\n" %(title, info)
#如果页面不包含<dd>标签,我们应该停止
else:
print u"所有页面已加载完"
self.enable = False
return contents
#创建一个开始方法
def start(self):
#打印第一页,此时self.pageIndex = 0,初始化时设置了
#设置页码x = 1
x = 1
#我们观察发现,第二页的pageIndex - 第一页的 = 第一页的小说的个数
#我们执行self.getContent的同时,获取了第一页的小说的个数
page_num = len(self.getContent(self.pageIndex))
print u"第%s页" %x
#利用self.enable控制下一页的打印
while self.enable == True:
#设置下一页的pageIndex
self.pageIndex += page_num
#页码+1
x += 1
#time.sleep(1) #可以利用time模块来设置sleep时间
#再次调用self.getContent的同时,获取当前页的小说的个数
page_num = len(self.getContent(self.pageIndex))
#在self.getContent中,如果不能获取到<dd>的内容,self.enable将会改为False,如果我们不加self.enable判断,仍会打印不存在小说信息的页码 if self.enable == True: 99 print u"第%s页" %x
DBXS = dbxs()
DBXS.start()
Python爬虫之利用BeautifulSoup爬取豆瓣小说(一)——设置代理IP的更多相关文章
- Python爬虫之利用BeautifulSoup爬取豆瓣小说(二)——回车分段打印小说信息
在上一篇文章中,我主要是设置了代理IP,虽然得到了相关的信息,但是打印出来的信息量有点多,要知道每打印一页,15个小说的信息全部会显示而过,有时因为屏幕太小,无法显示全所有的小说信息,那么,在这篇文章 ...
- Python爬虫之利用BeautifulSoup爬取豆瓣小说(三)——将小说信息写入文件
#-*-coding:utf-8-*- import urllib2 from bs4 import BeautifulSoup class dbxs: def __init__(self): sel ...
- python爬虫:利用正则表达式爬取豆瓣读书首页的book
1.问题描述: 爬取豆瓣读书首页的图书的名称.链接.作者.出版日期,并将爬取的数据存储到Excel表格Douban_I.xlsx中 2.思路分析: 发送请求--获取数据--解析数据--存储数据 1.目 ...
- python爬虫:利用BeautifulSoup爬取链家深圳二手房首页的详细信息
1.问题描述: 爬取链家深圳二手房的详细信息,并将爬取的数据存储到Excel表 2.思路分析: 发送请求--获取数据--解析数据--存储数据 1.目标网址:https://sz.lianjia.com ...
- Python爬虫使用lxml模块爬取豆瓣读书排行榜并分析
上次使用了BeautifulSoup库爬取电影排行榜,爬取相对来说有点麻烦,爬取的速度也较慢.本次使用的lxml库,我个人是最喜欢的,爬取的语法很简单,爬取速度也快. 本次爬取的豆瓣书籍排行榜的首页地 ...
- Python爬虫之利用正则表达式爬取内涵吧
首先,我们来看一下,爬虫前基本的知识点概括 一. match()方法: 这个方法会从字符串的开头去匹配(也可以指定开始的位置),如果在开始没有找到,立即返回None,匹配到一个结果,就不再匹配. 我们 ...
- Python爬虫实战二之爬取百度贴吧帖子
大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不 ...
- Python爬虫实战一之爬取糗事百科段子
大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...
- 转 Python爬虫实战二之爬取百度贴吧帖子
静觅 » Python爬虫实战二之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 ...
随机推荐
- 人工智能-baidu-aip语音识别(语音转文字)
做这个之前,需要在电脑上安装FFmpeg工具,将要转的语音格式转为PCM格式.FFmpeg不需要安装,下载后,打开bin文件夹,然后将路径放在系统环境变量里.记住,要关闭所有打开的Pycharm,然后 ...
- java基础—Hashtable,HashMap,TreeMap的差别
Hashtable : 此类实现一个哈希表,该哈希表将键映射到对应的值.不论什么非null 对象都能够作键值,是线程不同步的 HashMap : 基于哈希表的Map接口的实现.此实现提供全部可选的映 ...
- 《Python 机器学习》笔记(四)
数据预处理--构建好的训练数据集 机器学习算法最终学习结果的优劣取决于两个主要因素:数据的质量和数据中蕴含的有用信息的数量. 缺失数据的处理 在实际应用过程中,样本由于各种原因缺少一个或多个值得情况并 ...
- ELBO 与 KL散度
浅谈KL散度 一.第一种理解 相对熵(relative entropy)又称为KL散度(Kullback–Leibler divergence,简称KLD),信息散度(information dive ...
- 使用openresty + lua 搭建api 网关(一)安装openresty ,并添加lua模块
openresty 有点不多说,网上各种介绍,先安装吧. 官方操作在此,http://openresty.org/cn/installation.html, tar -xzvf openresty-V ...
- 剑指offer 面试36题
面试36题: 题:二叉搜索树与双向链表 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 解题思路一:由于输入的一个二叉搜索树, ...
- Python之------初识面向对象(Day22)
一.面向过程 VS 面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序 ...
- python多线程编程(3): 使用互斥锁同步线程
问题的提出 上一节的例子中,每个线程互相独立,相互之间没有任何关系.现在假设这样一个例子:有一个全局的计数num,每个线程获取这个全局的计数,根据num进行一些处理,然后将num加1.很容易写出这样的 ...
- OpenGL帧缓存对象(FBO:Frame Buffer Object)
http://blog.csdn.net/dreamcs/article/details/7691690 转http://blog.csdn.net/xiajun07061225/article/de ...
- gh-ost使用手册
gh-ost实战运用 一.安装步骤 1.环境 go版本:1.10.3 gh-ost版本:1.0.46 2.安装go语言 # 安装go依赖包 yum install bison ed gawk gcc ...