话不多说,先上代码:

# -*- coding:utf-8 -*-
import sys
import requests
import lxml
from bs4 import BeautifulSoup
from requests.cookies import RequestsCookieJar#设置请求头,伪装成浏览器
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36'}#设置目标url
url = 'https://book.douban.com/top250?start=0'#使用requests模块提供的的Http服务
resp = requests.get(url, headers = headers)#如果目标网页编码与本地不一致,修改本地默认编码方式(防止输出中文乱码)
if sys.getdefaultencoding() != resp.encoding:reload(sys)sys.setdefaultencoding(resp.encoding)#使用BeautifulSoup来分析和定位Html中我们所需的内容
soup = BeautifulSoup(resp.text,'lxml')              #构建BeautifulSoup对象#创建记录数据的文件
file_out = "C:\\out.txt"            #Windows下文件名分隔符为  " \\ " i = 0#使用BeautifulSoup中的select方法(返回的是list对象)获取所需内容name_list = soup.select('tr > td > div.pl2 > a')    #设置select方法中的参数可以用XPath也可以直接通过标签结点层层递进#定义一个结果列表result_list  = ["豆瓣图书排行榜"]#定义一个查重并更新列表的方法,如果当前元素已存在于列表中则不做更新操作
def FindIfRepeat (OldList,item):if item not in OldList:NewList = OldList.append(item)return NewListelse:return OldList#用for循环遍历soup对象返回的列表for name in name_list:i += 1outcomeList = name.get_text().strip().split()        #对于返回的结果进行分段并去掉两端空格for outcome in outcomeList:m = len(outcomeList)if m >= 2 :                                      #判断是否有对书的描述字段#使用迭代器遍历outcomelistNewoutcome = ""it = iter (outcomeList)for x in it:Newoutcome = Newoutcome + str(x) + " "Newoutcome = Newoutcome.split(':',1)#对于获取的结果做格式化处理name_format = "Top{rank},书名《{name}》,描述:{description}".format(rank = str(i),name = Newoutcome[0],description=Newoutcome[1])FindIfRepeat(result_list,name_format)         #调用查重函数进行查重更新结果列表的操作else:name_format = "Top{rank},书名《{name}》,描述:暂无".format(rank = str(i),name = outcomeList[0])FindIfRepeat(result_list,name_format)#将结果写入文件中
for i in range(len(result_list)):with open (file_out , "a+" ) as f :#使用with...open格式打开文件的好处在于不用手动关闭文件f.write(str(result_list[i]) + '\r\n')

输出结果:

豆瓣图书排行榜Top1,书名《追风筝的人》,描述:暂无Top2,书名《解忧杂货店》,描述:暂无Top3,书名《小王子》,描述:暂无Top4,书名《白夜行》,描述:暂无Top5,书名《围城》,描述:暂无Top6,书名《三体 》,描述: “地球往事”三部曲之一 Top7,书名《嫌疑人X的献身》,描述:暂无Top8,书名《活着》,描述:暂无Top9,书名《挪威的森林》,描述:暂无Top10,书名《百年孤独》,描述:暂无Top11,书名《红楼梦》,描述:暂无Top12,书名《看见》,描述:暂无Top13,书名《平凡的世界(全三部)》,描述:暂无Top14,书名《三体Ⅱ 》,描述: 黑暗森林 Top15,书名《三体Ⅲ 》,描述: 死神永生 Top16,书名《不能承受的生命之轻》,描述:暂无Top17,书名《达·芬奇密码》,描述:暂无Top18,书名《我们仨》,描述:暂无Top19,书名《天才在左 疯子在右 》,描述: 国内第一本精神病人访谈手记 Top20,书名《简爱(英文全本)》,描述:暂无Top21,书名《哈利·波特与魔法石》,描述:暂无Top22,书名《明朝那些事儿(壹) 》,描述: 洪武大帝 Top23,书名《傲慢与偏见》,描述:暂无Top24,书名《目送》,描述:暂无Top25,书名《恶意》,描述:暂无

不知道你们看懂了没,如果你是小白,那就请你往下看代码详解,大佬请绕道,哈哈!

代码详解

首先:你得知道一个制作一个爬虫的大概流程如下:

获取目标URL→通过requests(也可以使用urllib)等模块建立HTTP连接获得网页的返回内容➡通过BeautifulSoup(或者lxml)等模块解析HTML文档寻找所需内容➡遍历BeautifulSoup对象,输出目标内容到控制台或者指定文件。

准备工作:导入相关库和设置编码方式(很重要,爬虫最常见错误就是抓取回来的内容乱码,好习惯很重要哦!)

# -*- coding:utf-8 -*-
import sys
import requests
import lxml
from bs4 import BeautifulSoup
from requests.cookies import RequestsCookieJar

设置请求头,将爬虫伪装成浏览器(有些网站设置了反爬机制,不设置这个有可能爬虫没法用)

#设置请求头,伪装成浏览器
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36'}

设置请求头方法参考:https://blog.csdn.net/FloatDreamed/article/details/79208719

设置URL和创建requests对象

#设置目标url
url = 'https://book.douban.com/top250?start=0'#使用requests模块提供的的Http服务
resp = requests.get(url, headers = headers)

URL很简单,就是要爬取的目标网页。

创建requests对象,URL参数是必须的,其他的headers以及待会儿会讲到的cookie和proxies(代理)是可选的。有了requests对象,就可以使用它的Get 和Post方法了,如果学过Java,就应该明白这两个功能对于日常的网络服务是完全够用了的

Get方法用于向服务器请求并得到从服务器返回的数据(response对象),Post方法用于提交表单,向服务器更新数据等操作。

Requests库的详细用法参考:https://blog.csdn.net/iloveyin/article/details/21444613

中文乱码的解决方法

前面提到了爬虫最常见的问题是返回的数据中文乱码,对于爬虫小白来说这样的问题几乎不可避免,不过别担心,我这里有好几种解决中文乱码的方法,总有一款适合你。

方法一:(适用于Pycharm下编程)

先在代码头设置编码方式为 " UTF-8" ,UTF-8 是保存中文字符的通用代码。然后,如图所示的操作一般都能解决中文乱码问题。

其他方法参考以下链接:

https://blog.csdn.net/weixin_42134789/article/details/82904741

使用BeautifulSoup解析HTML文档

#使用BeautifulSoup来分析和定位Html中我们所需的内容
soup = BeautifulSoup(resp.text,'lxml')              #构建BeautifulSoup对象#使用BeautifulSoup中的select方法(返回的是list对象)获取所需内容name_list = soup.select('tr > td > div.pl2 > a')    #设置select方法中的参数可以用XPath也可以直接通过标签结点层层递进

写爬虫程序最关键的部分在于如何从网页中提取我们想要的内容,这里用到了一个强大的HTML解析库-----BeautifulSoup,通过BeautifulSoup对象可以很轻松的通过select或是find_all方法从繁杂的HTML中提取到有用的信息,其中最难理解的应该是select等方法中的参数怎么获取,不着急,下面就手把手的教你:

以下全程使用chrome浏览器,其他浏览器的操作步骤类似:

第一步:使用浏览器打开目标网页,F12进入开发者模式

第二步:点击图中所示按钮,再点击所需要定位的内容

第三步:分析复制下来的位置信息

#content > div > div.article > div > table:nth-child(2) > tbody > tr > td:nth-child(2) > div.pl2 > a

其实这看似复杂的东西不过就是HTML文档中书名标题所在的位置,是一层层的标签嵌套关系,我们的select方法就是要靠这个参数来定位到HTML文档中书名标题所在位置,然后通过soup.text 把书名标题标签里的内容提取出来,然后再输出到控制台或者写入文件中,我们爬虫的作用就达到了。

当然,复制过来的东西还不能直接用,因为这只是一个标题的,而我们要的是TOP25,所以要把具体的部分去掉,可以同样的方法多定位几个标题,多对比几次,找出共同的部分。

#一开始拿到的《追风筝的人》的定位是
#content > div > div.article > div > table:nth-child(2) > tbody > tr > td:nth-child(2) > div.pl2 > a#这是图中《解忧杂货店》的定位
#content > div > div.article > div > table:nth-child(4) > tbody > tr > td:nth-child(2) > div.pl2 > a#这是中《小王子》的定位
#content > div > div.article > div > table:nth-child(6) > tbody > tr > td:nth-child(2) > div.pl2 > a

把变化的地方去掉,留下共同的部分,tr前面都一样,累赘删掉了(后面有个div.p12是整个HTML中唯一,前面的父标签就可以省去了。)

简化后的结果如下:

> tr > td:nth-child(2) > div.pl2 > a#进一步简化> tr > td > div.pl2 > a

这里的分析只是一个参考,select中还可以填入其他的参数,像是正则表达式什么的,也可以使用find_all方法寻找内容,有关BeautifulSoup的详细使用方法可以参考:https://blog.csdn.net/qq_21933615/article/details/81171951

解析HTML文档的这部分内容是爬虫的核心,这些定位参数决定爬虫能否爬取到所需信息,一定要细心呐!

剩下的代码就是常规的东西了,是根据前面具体的返回结果的格式来设计如何美化输出,可以先把爬回来的东西输出到控制台,看看效果,然后再做相应的调整。

#把返回的内容先输入到控制台看看效果
for name in name_list:i += 1print(i,name.get_text().strip())

控制台显示的效果如下:

还行,中间有一大段空格,可以用str.format()函数进行格式化输出

#用for循环遍历soup对象返回的列表for name in name_list:i += 1outcomeList = name.get_text().strip().split()        #对于返回的结果进行分段并去掉两端空格for outcome in outcomeList:m = len(outcomeList)if m >= 2 :                                      #判断是否有对书的描述字段#使用迭代器遍历outcomelistNewoutcome = ""it = iter (outcomeList)for x in it:Newoutcome = Newoutcome + str(x) + " "Newoutcome = Newoutcome.split(':',1)#对于获取的结果做格式化处理name_format = "Top{rank},书名《{name}》,描述:{description}".format(rank = str(i),name = Newoutcome[0],description=Newoutcome[1])FindIfRepeat(result_list,name_format)         #调用查重函数进行查重更新结果列表的操作else:name_format = "Top{rank},书名《{name}》,描述:暂无".format(rank = str(i),name = outcomeList[0])FindIfRepeat(result_list,name_format)#将结果写入文件中
for i in range(len(result_list)):with open (file_out , "a+" ) as f :#使用with...open格式打开文件的好处在于不用手动关闭文件f.write(str(result_list[i]) + '\r\n')

美化之后的效果:

哈哈,强迫症的我看着就舒服多了。。。

知识拓展

  1. 使用proxies代理

前面提到了,有些网站会有反爬机制,要是一不小心被封了IP,那多尴尬呀!不慌,这篇博客就是给小白们提供福利的,下面就是使用代理的方法。

#使用动态代理,防止被封IP
proxies = {"http": "http://149.129.70.226:8434","https": "http://218.28.238.165:8267",
}#使用requests模块提供的的Http服务
resp = requests.get(url, headers = headers,proxies = proxies)

使用动态代理其实至于要定义一个参数proxies,然后把IP加进去,再加到requests请求方法中就行了鸭!easy?

不不不不不,其实你在使用的时候可能会碰到各种连接不上的情况,比如下面这种:

看吧,没这么简单吧?其实这是因为我这里用的IP地址是网上找到的免费IP,用的人多了,被目标网站封掉了(呜呜呜~),所以爬虫还是有风险的哦,不要轻易用自己的电脑IP反复爬取同一个网站哦!网上的免费IP很多,可以参考这个网址http://www.data5u.com/上面有10个免费IP可以用,不定期更新,一个不行就试试另一个呗~

最后提醒一点:爬取https的网站就要用HTTPS的IP哦!不然还是可能会连不上~

2.在请求头中加入cookie或者使用session保持登陆

有时候爬取某些网站的时候需要先登录,但是呢,我们爬取数据的时候不可能每爬取一次就重新登录一次,那样就太繁琐了,所以就要用到cookie(小甜饼),这可是浏览器最爱的美食呢!里面记录了用户的登录信息,我们只需要把它加到我们的请求头里就不用每次都登录啦!因为这相当于告诉服务器,“ 对,我胡汉三又回来啦!" ,服务器可以通过cookie知道当前请求的客户端已经登录过了。

#方法一#首次使用cookie时可以先打印出浏览器中保存的cookie格式,然后再设置相应的cookie
resp = request.get(url,headers = headers)
print(resp.cookies)#设置cookie(保存在本地端的用户信息)cookie_jar = RequestsCookieJar()        #创建一个cookiejar对象,urllib中也有类似的东西,作用是生成一个cookie对象cookie_jar.set(name  = " root " ,password =" 123456 " ) #set方法设置cookie的具体内容response = requests.get("url", cookies=cookie_jar)#方法二#使用session(会话)维持登陆(相当于保存在服务器端的cookie)session1 =requests.session()              #创建session对象resp = session1.get("url",headers = headers)    #再用session对象进行HTTP请求,这样就可以维持登录状态#方法一和二 只用一种就行

—————————————————————————   END ————————————————————————————

基于Requests的Python爬虫入门实例------爬取豆瓣图书排行榜的前25本图书(小白福利)相关推荐

  1. Python爬虫入门 | 4 爬取豆瓣TOP250图书信息

      先来看看页面长啥样的:https://book.douban.com/top250   我们将要爬取哪些信息:书名.链接.评分.一句话评价--   1. 爬取单个信息 我们先来尝试爬取书名,利用之 ...

  2. Python爬虫入门(爬取豆瓣电影信息小结)

    Python爬虫入门(爬取豆瓣电影信息小结) 1.爬虫概念 网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或脚本.爬虫的本质是模拟浏览器打开网页,获取网页中我们想要的那部分数据. 2.基本流程 ...

  3. Python爬虫入门 | 5 爬取小猪短租租房信息

    小猪短租是一个租房网站,上面有很多优质的民宿出租信息,下面我们以成都地区的租房信息为例,来尝试爬取这些数据. 小猪短租(成都)页面:http://cd.xiaozhu.com/   1.爬取租房标题 ...

  4. python 爬虫入门--文字爬取

    python 爬虫入门–文字爬取 对于爬虫,相信大家都不陌生,但是如何入门,大家还是停留在了解认知阶段吗?那可以试试下边的方法,一起来试一下. 首先我们试试爬取网页中的***文本信息*** 使用的是我 ...

  5. python爬虫入门(一)爬取钓鱼吧

    python爬虫入门(一)爬取钓鱼吧 # Date : 2022/1/1 17:11 ''' 需求:1.输入贴吧名称:钓鱼吧https://tieba.baidu.com/f?kw=钓鱼吧&p ...

  6. python爬虫——Cookie登录爬取豆瓣短评和影评及常见问题

    python爬虫--Cookie登录爬取豆瓣短评和影评 常见问题(本文已解决) 具体步骤 一.获取网页源码 短评.影评 二.解析网页源码及爬取评论 1.短评网页解析 ①确定位置 2.短评爬取 ①名称爬 ...

  7. Python爬虫实战(1) | 爬取豆瓣网排名前250的电影(下)

    在Python爬虫实战(1) | 爬取豆瓣网排名前250的电影(上)中,我们最后爬出来的结果不是很完美,这对于"精益求精.追求完美的"程序猿来说怎么能够甘心 所以,今天,用pyth ...

  8. python爬虫爬取豆瓣电影信息城市_Python爬虫入门 | 2 爬取豆瓣电影信息

    这是一个适用于小白的Python爬虫免费教学课程,只有7节,让零基础的你初步了解爬虫,跟着课程内容能自己爬取资源.看着文章,打开电脑动手实践,平均45分钟就能学完一节,如果你愿意,今天内你就可以迈入爬 ...

  9. Python 爬虫入门(二)——爬取妹子图

    Python 爬虫入门 听说你写代码没动力?本文就给你动力,爬取妹子图.如果这也没动力那就没救了. GitHub 地址: https://github.com/injetlee/Python/blob ...

最新文章

  1. install tabix/bgzip
  2. Hibernate4继承映射
  3. 小学计算机技术指导纲要,《中小学信息技术课程指导纲要(试行)》
  4. DeepNude已迅速下线,来看看它涉及的图像修复技术
  5. excel中vlookup函数的使用方法_vlookup函数功能非常强大,那在Python中如何实现?
  6. archlinux安装gnome-shell主题
  7. mysql格式化11位时间戳_格式化MYSQL时间戳函数FROM_UNIXTIME
  8. flacs 安装教程_文章详细信息
  9. ZoomIt v4.5
  10. element-ui的upload 上传组件 照片墙当超过限定图片后隐藏上传按钮
  11. 淘宝违规考试软件1.0
  12. python中shelf对象_shelve 用来持久化任意的Python对象实例代码_python_脚本之家
  13. kali 中 MongoDB安装
  14. 通俗易懂学Docker
  15. 下载论坛源码GBK UTF8 BIG5分别是什么意思
  16. 无锡闹市自动驾驶车,打破RoboBus和RoboTaxi边界
  17. VC++ CStdioFile文本文件读写
  18. 作业管理系统设计报告
  19. 重启服务后Redisson队列一直阻塞 不消费过期数据
  20. ZWeily的小品文(四)C++入门教程(3)

热门文章

  1. BigInteger实际用法
  2. java 段子_那些关于程序员的段子
  3. Ubuntu20.04设置DNS后自动重置问题
  4. iOS开发技术的核心摘要
  5. 推荐一波实用资源网站
  6. java钢琴_Java swing实现支持录音等功能的钢琴程序
  7. 记录一次反混淆的过程
  8. C#习题——数组之对角线之和
  9. ReactNative基础(三)了解ScrollView并打造一个Banner效果
  10. 【转】用Python的Pandas和Matplotlib绘制股票KDJ指标线