学了大概4、5天的爬虫终于能爬点图片和文章了
其实这两个差不多,后面一个稍微复杂一点
这次来讲解一下怎么爬取标题的这个网址

要做的是爬取这些文章,我们输入起始页码和结束页码,爬取页码之间的每篇文章
我们现在看到的是标题,标题点进去之后才是我们要的文章,我们要把每篇文章写进一个html文件里
需求就是这样,开工!
首先我们看看url和页码有什么关系


很明显就是后面的50_n.html就是决定页码的地方了
那么第一步先去获取响应

import urllib.request
import urllib.parse
import re
import os
import timedef main():url = 'http://www.yikexun.cn/lizhi/qianming/'start_page = int(input('输入起始页码:'))end_page = int(input('输入结束页码:'))for page in range(start_page, end_page + 1):#生成请求对象request = handle_request(url, page)#发送请求,获取响应content = urllib.request.urlopen(request).read().decode()#下载句子,封装成函数download(content)

因为不止有一页,我用了一个循环,每一页发送一个请求
然后把生成请求对象封装成一个函数,可以让代码更简洁

def handle_request(url, page=None):#如果没有页数这个参数,就不拼接urlif page != None:url = url + 'list_50_' + str(page) + '.html'# print(url)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3590.0 Safari/537.36',}request = urllib.request.Request(url=url, headers=headers)return request

函数根据页数和url拼接,得到我们想要的那一页的网址
打印出来大概是这样

http://www.yikexun.cn/lizhi/qianming/list_50_1.html
http://www.yikexun.cn/lizhi/qianming/list_50_2.html
http://www.yikexun.cn/lizhi/qianming/list_50_3.html

那个if条件句是为了另一个请求做准备,因为另一个请求并不需要page这个参数,提高代码的重用
然后就是仿造信息头,生成请求对象,再返回到主函数

回到主函数,有了请求自然要去获取响应
我们把获取的响应直接转成字符串(用decode()函数)
这样方便我们后边用正则处理

处理句子我们也封装成一个函数

def download(content):#加了re.S才能用 .*? 匹配换行符,想获取哪个,哪个加小括号pattern = re.compile(r'<h3><a href="(/lizhi/qianming/\d+\.html)"><b>(.*?)</b></a>', re.S)#把爬到的内容放到 lt 里面,以列表的格式。lt = pattern.findall(content)# print(lt)#遍历列表for href_title in lt:#拼接这个文章的 url,文章的url是列表每个元组中的第零个元素a_herf = 'http://www.yikexun.cn' + href_title[0]#获取文章标题title = href_title[-1]#发送请求,再封装成一个函数,直接获取封装好的内容text = get_text(a_herf)#写入到html文件string = '<h1>%s</h1>%s' %(title, text)with open('lizhi.html', 'a') as fp:fp.write(string)

第一步就是去匹配要的内容,这之前我们要看看网页的元素内容,鼠标放在文章标题上右键,检查就能看到网页的代码

我匹配的仅仅是<h3>标签里的内容每一篇文章都是
很明显,我们也需要<a>标签中的url,因为那个就是我们文章的url,后面二次请求就要用到

pattern = re.compile(r'<h3><a href="(/lizhi/qianming/\d+\.html)"><b>(.*?)</b></a>', re.S)

解释下这个正则,用到了 \d+(.*?)

第一个是用来匹配数字,因为发现网页代码中,每篇文章的那里都不一样

第二个是用来匹配<b>标签中的文字,也就是标题

要注意的是 (.*?) 是非贪婪模式,后面要加上re.S这个参数才能匹配换行符,因为本来 “.” 就是匹配换行符以外的字符。至于为什么这么用,后面估计会有很多用 “.*?” 来匹配,所以现在就这么用着先

还有 \d+\. 后面的 \. 是转义字符,把". "当作字符而不是正则表达式

然后我们用 findall() 方法把之前获取的响应内容当作参数放里面,返回一个列表。列表中每一个元素都是一个元组,元组中的第一个是每一篇文章的标识,第二个是文章的标题,可以看到我们正则表达式也就用了两个,所以匹配出两个元素

[('/lizhi/qianming/20190841364.html', '愿有前程可奔赴,亦有岁月可回首——前程似锦要靠自己打拼'), ('/lizhi/qianming/20190741356.html', '人活着,不是为了被打败——为自己争口气'), ('/lizhi/qianming/20190741353.html', '哭着吃过饭的人,是能够走下去的——时刻把握自己的梦想'), ('/lizhi/qianming/20190741350.html', '活着就意味着必须做点什么,请好好努力——生活很难但请你坚持'), ('/lizhi/qianming/20190741338.html', '你想要赢,拿命来换——奋斗者的必读语录'), ('/lizhi/qianming/20190741330.html', '没有一个冬天不可逾越,没有一个春天不会来临——年轻人的励志经典语录'), ('/lizhi/qianming/20190741326.html', '钱非万能 无钱万万不能——现实的残酷要求你去拼搏'), ('/lizhi/qianming/20190641322.html', '前面的路还很远,你可能会哭,但是一定要走下去——励志追梦人的经典语录'), ('/lizhi/qianming/20190541318.html', '越努力越幸运,这句话真实存在——离梦想更近一步'), ('/lizhi/qianming/20190541315.html', '不要低头,要往上看,要去更高的地方——经典励志语录'), ('/lizhi/qianming/20190541314.html', '人一旦无畏,人生就会无限——成为你想成为的那个人'), ('/lizhi/qianming/20190541310.html', '虽然很辛苦,但努力过真好——将来的你会感谢现在的自己'), ('/lizhi/qianming/20190541303.html', '祝我们永远年轻永远热泪盈眶——年轻人努力奋斗的经典励志语录'), ('/lizhi/qianming/20190541301.html', '如果我踩不过荆棘,那么便不配得到风光——2019励志人生青春语录'), ('/lizhi/qianming/20190541295.html', '我知道你很累,但别人都在飞。——2019高考加油励志经典语录')]

这是我匹配出来结果,只能单行显示。。。每个小括号就是一个元组

到这里,文章标题我们已经处理好了,文章的url也获取了,所以现在发送第二次请求,获取文章内容

打开第一篇

开发者还是挺贴心的,直接告诉我们这内容,打开方法还是一样,右键检查

要匹配的就是 <div class=neirong> 这个标签的东西

def get_text(href):#调用函数handle_request,生成请求对象request = handle_request(href)#发送请求,获取响应内容content = urllib.request.urlopen(request).read().decode()#处理获取到的每一篇文章pattern = re.compile(r'<div class="neirong">(.*?)</div>', re.S)#返回列表lt = pattern.findall(content)# print(lt)# exit()#返回的列表只有一个元素return lt[0]

直接看正则,没什么好说的,(.*?)匹配这标签之间的任何字符,这么理解就可以了
虽然网上看正则表达式规则蛮多的,实际用起来确实只有几个

直接返回列表,这里面就是文章了,因为只有一个元素,return lt[0] 就可以返回字符串,里面还是包含标签的,写进html文件时就能直接显示了

#写入到html文件string = '<h1>%s</h1>%s' %(title, text)with open('lizhi.html', 'a') as fp:fp.write(string)

最后一步,在 download(content) 里面,然后就完成啦
看成果



更新一波,去除掉图片的标签,直接上代码吧

def get_text(href):#调用函数handle_request,生成请求对象request = handle_request(href)#发送请求,获取响应内容content = urllib.request.urlopen(request).read().decode()#处理获取到的每一篇文章pattern = re.compile(r'<div class="neirong">(.*?)</div>', re.S)#返回列表lt = pattern.findall(content)text = lt[0]#把里面的图片清除patt = re.compile(r'<img .*?>', re.M)text = patt.sub('', text)# print(text)# exit()#返回的列表只有一个元素return text

Python爬虫过程 爬取www.yikexun.cn/励志句子过程(双请求)相关推荐

  1. python可以爬取的内容有什么_Python爬取视频(其实是一篇福利)过程解析 Python爬虫可以爬取什么...

    如何用python爬取视频网站的数据 如何用python爬取js渲染加载的视频文件不是每个人都有资格说喜欢,也不是每个人都能选择伴你一生! 有哪位大神指导下,有些视频网站上的视频文件是通过 js 加载 ...

  2. python爬取ajax动态内容肯德基门店,Python爬虫如何爬取KFC地址

    随着人们生活水平的提高,肯德基这类的快餐消费的十分火爆,成为小朋友和年轻人的最爱,我们到一个地方想要找到肯德基店面,会根据导航获取肯德基地址,那你知道我们也可以使用python爬虫获取KFC地址吗?我 ...

  3. Python爬虫实战爬取租房网站2w+数据-链家上海区域信息(超详细)

    Python爬虫实战爬取租房网站-链家上海区域信息(过程超详细) 内容可能有点啰嗦 大佬们请见谅 后面会贴代码 带火们有需求的话就用吧 正好这几天做的实验报告就直接拿过来了,我想后面应该会有人用的到吧 ...

  4. python爬虫能爬取微信密码吗_爬虫如何爬取微信公众号文章

    下篇文章:python爬虫如何爬取微信公众号文章(二) 下下篇连接python爬虫如何实现每天爬取微信公众号的推送文章 因为最近在法院实习,需要一些公众号的数据,然后做成网页展示出来便于查看,之前我倒 ...

  5. Python爬虫 - scrapy - 爬取妹子图 Lv1

    0. 前言 这是一个利用python scrapy框架爬取网站图片的实例,本人也是在学习当中,在这做个记录,也希望能帮到需要的人.爬取妹子图的实例打算分成三部分来写,尝试完善实用性. 系统环境 Sys ...

  6. python爬虫之爬取网页基础知识及环境配置概括

    记:python爬虫是爬取网页数据.统计数据必备的知识体系,当我们想统计某个网页的部分数据时,就需要python爬虫进行网络数据的爬取,英文翻译为 spider 爬虫的核心 1.爬取网页:爬取整个网页 ...

  7. Python爬虫之爬取酷狗音乐歌曲

    Python爬虫之爬取酷狗音乐歌曲 1.安装第三方库 在Python的语言库中, 分为Python标准库和Python的第三方库. Python标准库是在你安装Python的时候已经包含在了安装目录下 ...

  8. Python爬虫之爬取淘女郎照片示例详解

    更多编程教程请到:菜鸟教程 https://www.piaodoo.com/ 友情链接: 高州阳光论坛https://www.hnthzk.com/ 人人影视http://www.op-kg.com/ ...

  9. Python爬虫之爬取车票信息

    Python爬虫之爬取所有火车站的站台信息 前面我写过一篇关于火车站站台的查询,这篇基于站台的查询写火车车票余额信息查询-- 一.信息获取: 获取请求地址: 在浏览器菜单中找到Web开发者模式,打开网 ...

最新文章

  1. 黄聪:原生js的音频播放器,兼容pc端和移动端(原创)
  2. 推荐8个特别实用、功能强大的软件,解决痛点需求
  3. SharePoint2010-CustomAction中的ContentTypeId属性已经消失了
  4. 用ZooKeeper做为注册中心搭建基于Spring Cloud实现服务注册与发现
  5. 电商的折扣体系是如何搭建的?
  6. 我的世界源代码python_用Python写的游戏《我的世界》 还原初代世界
  7. base64的php文件上传,PHP传统文件上传和Base64位文件上传
  8. openshift_在WildFly和OpenShift上的WebSocket聊天
  9. iphone最新款手机_苹果用户不换安卓手机的8点原因,最后一点最关键
  10. openeim 成片的蝴蝶兰盛开在绿树之间
  11. java中初始化块、静态初始化块和构造方法
  12. ActiveReports 9实战教程(2): 准备数据源(设计时、运行时)
  13. UVA785 LA5281 Grid Colouring【DFS】
  14. IntelliJ IDEA 12 与 Tomcat7 配置
  15. IDEA 代码格式化
  16. Javascript时间脚本收集
  17. python怎么搭建网站_如何用Python搭建一个网站?
  18. 使用cookie和session实现用户的认证和授权(原生方式,不使用安全框架)
  19. 期货CTP接口C++源码与C#应用程序的对接
  20. Ubuntu安装repo

热门文章

  1. RIP v1因掩码不同产生主机路由而ping不通
  2. 有感~半导体技术之晶圆尺寸,450mm是否会来到
  3. EXIN Agile Scrum Master(ASM)认证全球工资 学习一次通过认证
  4. linux开发板断电重启后rtc归0,开发板RTC时间设置有效,但断电后自动恢复
  5. 回车符、换行符和回车换行符
  6. iOS:YYModel的简单使用
  7. python cron_你应该使用 Python 管理 Cron 作业
  8. matlab获取当前打开软件的句柄,oop – 如何获取MATLAB句柄对象的ID?
  9. iOS NavigationBar的占位问题
  10. 常见前端安全问题以及防御措施