python 爬虫框架爬虫何时解码

在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
标签:至少1个,最多5个
作者:xiaoyu微信公众号:Python爬虫之路知乎:
前情回顾,urllib的基本用法
urllib库的基本组成
利用最简单的urlopen方法爬取网页html
利用Request方法构建headers模拟浏览器操作
error的异常操作
具体内容参见。urllib库除了以上基础的用法外,还有很多高级的功能,可以更加灵活的适用在爬虫应用中,比如:
使用HTTP的POST请求方法向服务器提交数据实现用户登录
使用代理IP解决防止反爬
设置超时提高爬虫效率
解析URL的方法
本次将会对这些内容进行详细的分析和讲解。
POST是HTTP协议的请求方法之一,也是比较常用到的一种方法,用于向服务器提交数据。博主先介绍进行post请求的一些准备工作,然后举一个例子,对其使用以及更深层概念进行详细的的剖析。
POST请求的准备工作
既然要提交信息给服务器,我们就需要知道信息往哪填,填什么,填写格式是什么?带这些问题,我们往下看。
同样提交用户登录信息(用户名和密码),不同网站可能需要的东西不一样,比如淘宝反爬机制较复杂,会有其它一大串的额外信息。这里,我们以豆瓣为例(相对简单),目标是弄清楚POST是如何使用的,复杂内容会在后续实战部分与大家继续分享。
抛出上面像淘宝一样需要的复杂信息,如果仅考虑用户名和密码的话,我们的准备工作其实就是要弄明白用户名和密码标签的属性name是什么,以下两种方法可以实现。
浏览器F12查看element获取
也可以通过抓包工具Fiddler获取,fiddler的下载地址
废话不多说了,让我们看看到底如何找到name?
1. 浏览器F12
通过浏览器F12元素逐层查看到(我是用的Chrome),邮箱/手机号标签的name="form_email", 密码的标签name="form_email",如下图红框所示。
但要说明的是,两个标签的name名称并不是固定的,上面查看的name名称只是豆瓣网站定义的,不代表所有。其它的网站可能有会有不同的名称,比如name="username", name="password"之类的。因此,针对不同网站的登录,需要每次查看name是什么。
2. 通过fiddler抓包工具
博主推荐使用fiddler工具,非常好用。爬虫本身就是模拟浏览器工作,我们只需要知道浏览器是怎么工作的就可以了。
fiddler会帮助我们抓取浏览器POST请求的所有内容,这样我们得到了浏览器POST的信息,把它填到爬虫程序里模拟浏览器操作就OK了。另外,也可以通过fiddler抓到浏览器请求的headers,非常方便。
安装fiddler的小伙伴们注意:fiddler证书问题的坑(无法抓取HTTPs包),可以通过Tools —& Options —&HTTPS里面打勾Decrypt HTTPS traffic修改证书来解决。否则会一直显示抓取 Tunnel 信息包...
好了,完成了准备工作,我们直接上一段代码理解下。
POST请求的使用
# coding: utf-8
import urllib.request
import urllib.error
import urllib.parse
# headers 信息,从fiddler上或你的浏览器上可复制下来
headers = {'Accept': 'text/html,application/xhtml+xml,
application/q=0.9,image/webp,image/apng,
*/*;q=0.8',
'Accept-Language': 'zh-CN,q=0.9',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3;
Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko)Chrome/48.0
.2564.48 Safari/537.36'
# POST请求的信息,填写你的用户名和密码
value = {'source': 'index_nav',
'form_password': 'your password',
'form_email': 'your username'
data = urllib.parse.urlencode(value).encode('utf8')
response = urllib.request.Request(
'https://www.douban.com/', data=data, headers=headers)
html = urllib.request.urlopen(response)
result = html.read().decode('utf8')
print(result)
except urllib.error.URLError as e:
if hasattr(e, 'reason'):
print('错误原因是' + str(e.reason))
except urllib.error.HTTPError as e:
if hasattr(e, 'code'):
print('错误编码是' + str(e.code))
print('请求成功通过。')
运行结果:
&!DOCTYPE HTML&
&html lang="zh-cmn-Hans" class="ua-windows ua-webkit"&
&meta charset="UTF-8"&
&meta name="description" content="提供图书、电影、音乐唱片的
推荐、评论和价格比较,以及城市独特的文化生活。"&
window.attachEvent('onload', _ga_init);
注意:复制header的时候请去掉 这一项'Accept-Encoding':' gzip, deflate, 否则会提示decode的错误。
POST请求代码分析
我们来分析一下上面的代码,与urllib库request的使用基本一致,urllib库request的基本用法可参考上篇文章,这里多出了post的data参数和一些解析的内容,着重讲解一下。
data = urllib.parse.urlencode(value).encode('utf8')
这句的意思是利用了urllib库的parse来对post内容解析,为什么要解析呢?
这是因为post内容需要进行一定的编码格式处理后才能发送,而编码的规则需要遵从RFC标准,百度了一下RFC定义,供大家参考:*
Request ForComments(RFC),是一系列以编号排定的文件。文件收集了有关互联网相关信息,以及UNIX和互联网社区的软件文件。目前RFC文件是由InternetSociety(ISOC)赞助发行。基本的互联网通信协议都有在RFC文件内详细说明。RFC文件还额外加入许多的论题在标准内,例如对于互联网新开发的协议及发展中所有的记录。因此几乎所有的互联网标准都有收录在RFC文件之中。*
而parse的urlencode方法是将一个字典或者有顺序的二元素元组转换成为URL的查询字符串(说白了就是按照RFC标准转换了一下格式)。然后再将转换好的字符串按UTF-8的编码转换成为二进制格式才能使用。
注:以上是在Python3.x环境下完成,Python3.x中编码解码规则为 byte—&string—&byte的模式,其中byte—&string为解码,string—&byte为编码
代理IP的使用
为什么要使用代理IP?因为各种反爬机制会检测同一IP爬取网页的频率速度,如果速度过快,就会被认定为机器人封掉你的IP。但是速度过慢又会影响爬取的速度,因此,我们将使用代理IP取代我们自己的IP,这样不断更换新的IP地址就可以达到快速爬取网页而降低被检测为机器人的目的了。
同样利用urllib的request就可以完成代理IP的使用,但是与之前用到的urlopen不同,我们需要自己创建订制化的opener。什么意思呢?
urlopen就好像是opener的通用版本,当我们需要特殊功能(例如代理IP)的时候,urlopen满足不了我们的需求,我们就不得不自己定义并创建特殊的opener了。
request里面正好有处理各种功能的处理器方法,如下:
ProxyHandler, UnknownHandler, HTTPHandler,
HTTPDefaultErrorHandler, HTTPRedirectHandler,
FTPHandler, FileHandler, HTTPErrorProcessor, DataHandler
我们要用的是第一个ProxyHandler来处理代理问题。
让我们看一段代码如何使用。
# coding:utf-8
import urllib.request
import urllib.error
import urllib.parse
# headers信息,从fiddler上或浏览器上可复制下来
headers = {'Accept': 'text/html,application/xhtml+xml,
application/q=0.9,image/webp,image/apng,
*/*;q=0.8',
'Accept-Language': 'zh-CN,q=0.9',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3;
x64) AppleWebKit/537.36 (KHTML,
like Gecko)Chrome/48.0.2564.48
Safari/537.36'
# POST请求的信息
value = {'source': 'index_nav',
'form_password': 'your password',
'form_email': 'your username'
# 代理IP信息为字典格式,key为'http',value为'代理ip:端口号'
proxy = {'http': '115.193.101.21:61234'}
data = urllib.parse.urlencode(value).encode('utf8')
response = urllib.request.Request(
'https://www.douban.com/', data=data, headers=headers)
# 使用ProxyHandler方法生成处理器对象
proxy_handler = urllib.request.ProxyHandler(proxy)
# 创建代理IP的opener实例
opener = urllib.request.build_opener(proxy_handler)
# 将设置好的post信息和headers的response作为参数
html = opener.open(response)
result = html.read().decode('utf8')
print(result)
except urllib.error.URLError as e:
if hasattr(e, 'reason'):
print('错误原因是' + str(e.reason))
except urllib.error.HTTPError as e:
if hasattr(e, 'code'):
print('错误编码是' + str(e.code))
print('请求成功通过。')
在上面post请求代码的基础上,用自己创建的opener替换urlopen即可完成代理IP的操作,代理ip可以到一些免费的代理IP网站上查找,博主整理出几个,如:
运行得到的结果与使用本机IP一样。
代理IP代码分析
# 这个代理IP数据类型为字典,如果是http协议,key值就为**"http"**,value值应为**"代理IP:端口号"的格式**。
proxy = {'http': '115.193.101.21:61234'}
# 使用ProxyHandler方法创建proxy处理器对象
proxy_handler = urllib.request.ProxyHandler(proxy)
# 创建代理IP的opener实例,参数为proxy处理器对象
opener = urllib.request.build_opener(proxy_handler)
# 用代理IP的opener打开指定状态的URL信息
html = opener.open(response)
设置超时的目的是为了防止爬取网站的时候,等待时间过长而导致效率的降低。有效的超时设置可以强制结束等待而进行下一次的爬取,下面来一段代码看如何使用。
# coding:utf-8
import urllib.request
import urllib.error
import urllib.parse
import socket
# headers信息,从fiddler上或浏览器上可复制下来
headers = {'Accept': 'text/html,application/xhtml+xml,
application/q=0.9,image/webp,image/apng,
*/*;q=0.8',
'Accept-Language': 'zh-CN,q=0.9',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3;
x64) AppleWebKit/537.36
(KHTML, like Gecko)Chrome/48.0
.2564.48 Safari/537.36'
# POST请求的信息
value = {'source': 'index_nav',
'form_password': 'your password',
'form_email': 'your username'
# 代理IP为字典格式,key为'http',value为'代理ip:端口号'
proxy = {'http': '115.193.101.21:61234'}
# 设置超时为2秒,单位为秒
timeout = 2
# 设置socket超时
socket.setdefaulttimeout(timeout)
data = urllib.parse.urlencode(value).encode('utf8')
response = urllib.request.Request(
'https://www.douban.com/', data=data, headers=headers)
# 使用ProxyHandler方法生成处理器对象
proxy_handler = urllib.request.ProxyHandler(proxy)
# 创建代理IP的opener实例
opener = urllib.request.build_opener(proxy_handler)
# 将设置好的post信息和headers的response作为参数
html = opener.open(response)
result = html.read().decode('utf8')
print(result)
except urllib.error.URLError as e:
if hasattr(e, 'reason'):
print('错误原因是' + str(e.reason))
except urllib.error.HTTPError as e:
if hasattr(e, 'code'):
print('错误编码是' + str(e.code))
except socket.timeout:
print('socket超时')
print('请求成功通过。')
在post和代理IP使用的基础上又增加了超时的使用。
# 设置超时为2秒,单位为秒
timeout = 2
#设置socket超时时间,如果不设置,则会使用默认时间。
socket.setdefaulttimeout(timeout)
# 同时对socket超时timeout的错误设置了异常,timeout错误属于OSerror的子类,时间超出指定timeout就会提示socket超时。
except socket.timeout:
print('socket超时')
urllib库parse解析
除了上面提到的urlencode方法,urllib库的parse中还有很多其它的方法可以使用,如:
#urlparse:把URL解析成6个部分
&scheme&://&netloc&/&path&;&params&?&query&#&fragment&
#urlsplit:把URL解析成5个部分
&scheme&://&netloc&/&path&?&query&#&fragment&
# urlunsplit,urlunparse:进行URL的重组
# 还有urljoin,urldefrag等。
更多用法可以查找官方request源码,也会在后续实战例子中陆续使用介绍。
主要介绍了urllib库的一些高级使用用法:
POST请求的准备和使用方法
代理IP的使用
超时的使用
如果想学习Python网络爬虫,可以关注微信公众号Python爬虫之路,博主会一直更新精彩内容,并分享更多的实战讲解,带你走进爬虫世界。
3 收藏&&|&&6
你可能感兴趣的文章
8 收藏,1.1k
13 收藏,491
本作品采用 署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可
分享到微博?
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)5,669被浏览214,314分享邀请回答lining0806.com/,你就会看到宁哥的小站首页。简单来说这段过程发生了以下四个步骤:查找域名对应的IP地址。向IP对应的服务器发送请求。服务器响应请求,发回网页内容。浏览器解析网页内容。网络爬虫要做的,简单来说,就是实现浏览器的功能。通过指定url,直接返回给用户所需要的数据,而不需要一步步人工去操纵浏览器获取。抓取这一步,你要明确要得到的内容是什么?是HTML源码,还是Json格式的字符串等。1. 最基本的抓取抓取大多数情况属于get请求,即直接从对方服务器上获取数据。首先,Python中自带urllib及urllib2这两个模块,基本上能满足一般的页面抓取。另外,也是非常有用的包,与此类似的,还有等等。Requests:
import requests
response = requests.get(url)
content = requests.get(url).content
print "response headers:", response.headers
print "content:", content
import urllib2
response = urllib2.urlopen(url)
content = urllib2.urlopen(url).read()
print "response headers:", response.headers
print "content:", content
Httplib2:
import httplib2
http = httplib2.Http()
response_headers, content = http.request(url, 'GET')
print "response headers:", response_headers
print "content:", content
此外,对于带有查询字段的url,get请求一般会将来请求的数据附在url之后,以?分割url和传输数据,多个参数用&连接。data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.get(url=url, params=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
full_url = url+'?'+data
response = urllib2.urlopen(full_url)
相关参考:参考项目:2. 对于登陆情况的处理2.1 使用表单登陆这种情况属于post请求,即先向服务器发送表单数据,服务器再将返回的cookie存入本地。data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.post(url=url, data=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
req = urllib2.Request(url=url, data=data)
response = urllib2.urlopen(req)
2.2 使用cookie登陆使用cookie登陆,服务器会认为你是一个已登陆的用户,所以就会返回给你一个已登陆的内容。因此,需要验证码的情况可以使用带验证码登陆的cookie解决。import requests
requests_session = requests.session()
response = requests_session.post(url=url_login, data=data)
若存在验证码,此时采用response = requests_session.post(url=url_login, data=data)是不行的,做法应该如下:response_captcha = requests_session.get(url=url_login, cookies=cookies)
response1 = requests.get(url_login) # 未登陆
response2 = requests_session.get(url_login) # 已登陆,因为之前拿到了Response Cookie!
response3 = requests_session.get(url_results) # 已登陆,因为之前拿到了Response Cookie!
相关参考:参考项目:3. 对于反爬虫机制的处理3.1 使用代理适用情况:限制IP地址情况,也可解决由于“频繁点击”而需要输入验证码登陆的情况。这种情况最好的办法就是维护一个代理IP池,网上有很多免费的代理IP,良莠不齐,可以通过筛选找到能用的。对于“频繁点击”的情况,我们还可以通过限制爬虫访问网站的频率来避免被网站禁掉。proxies = {'http':'http://XX.XX.XX.XX:XXXX'}
Requests:
import requests
response = requests.get(url=url, proxies=proxies)
import urllib2
proxy_support = urllib2.ProxyHandler(proxies)
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
urllib2.install_opener(opener) # 安装opener,此后调用urlopen()时都会使用安装过的opener对象
response = urllib2.urlopen(url)
3.2 时间设置适用情况:限制频率情况。Requests,Urllib2都可以使用time库的sleep()函数:import time
time.sleep(1)
3.3 伪装成浏览器,或者反“反盗链”有些网站会检查你是不是真的浏览器访问,还是机器自动访问的。这种情况,加上User-Agent,表明你是浏览器访问即可。有时还会检查是否带Referer信息还会检查你的Referer是否合法,一般再加上Referer。headers = {'User-Agent':'XXXXX'} # 伪装成浏览器访问,适用于拒绝爬虫的网站
headers = {'Referer':'XXXXX'}
headers = {'User-Agent':'XXXXX', 'Referer':'XXXXX'}
Requests:
response = requests.get(url=url, headers=headers)
import urllib, urllib2
req = urllib2.Request(url=url, headers=headers)
response = urllib2.urlopen(req)
4. 对于断线重连不多说。def multi_session(session, *arg):
retryTimes = 20
while retryTimes&0:
return session.post(*arg)
print '.',
retryTimes -= 1
或者def multi_open(opener, *arg):
retryTimes = 20
while retryTimes&0:
return opener.open(*arg)
print '.',
retryTimes -= 1
这样我们就可以使用multi_session或multi_open对爬虫抓取的session或opener进行保持。5. 多进程抓取这里针对进行并行抓取的实验对比: 与 相关参考:6. 对于Ajax请求的处理对于“加载更多”情况,使用Ajax来传输很多数据。它的工作原理是:从网页的url加载网页的源代码之后,会在浏览器里执行JavaScript程序。这些程序会加载更多的内容,“填充”到网页里。这就是为什么如果你直接去爬网页本身的url,你会找不到页面的实际内容。这里,若使用Google Chrome分析”请求“对应的链接(方法:右键→审查元素→Network→清空,点击”加载更多“,出现对应的GET链接寻找Type为text/html的,点击,查看get参数或者复制Request URL),循环过程。如果“请求”之前有页面,依据上一步的网址进行分析推导第1页。以此类推,抓取抓Ajax地址的数据。对返回的json格式数据(str)进行正则匹配。json格式数据中,需从'\uxxxx'形式的unicode_escape编码转换成u'\uxxxx'的unicode编码。7. 自动化测试工具SeleniumSelenium是一款自动化测试工具。它能实现操纵浏览器,包括字符填充、鼠标点击、获取元素、页面切换等一系列操作。总之,凡是浏览器能做的事,Selenium都能够做到。这里列出在给定城市列表后,使用selenium来动态抓取的票价信息的代码。参考项目:8. 验证码识别对于网站有验证码的情况,我们有三种办法:使用代理,更新IP。使用cookie登陆。验证码识别。使用代理和使用cookie登陆之前已经讲过,下面讲一下验证码识别。可以利用开源的Tesseract-OCR系统进行验证码图片的下载及识别,将识别的字符传到爬虫系统进行模拟登陆。当然也可以将验证码图片上传到打码平台上进行识别。如果不成功,可以再次更新验证码识别,直到成功为止。参考项目:爬取有两个需要注意的问题:如何监控一系列网站的更新情况,也就是说,如何进行增量式爬取?对于海量数据,如何实现分布式爬取?分析抓取之后就是对抓取的内容进行分析,你需要什么内容,就从中提炼出相关的内容来。常见的分析工具有,,等等。存储分析出我们需要的内容之后,接下来就是存储了。我们可以选择存入文本文件,也可以选择存入或数据库等。存储有两个需要注意的问题:如何进行网页去重?内容以什么形式存储?ScrapyScrapy是一个基于Twisted的开源的Python爬虫框架,在工业中应用非常广泛。相关内容可以参考,同时给出这篇文章介绍的爬取的项目代码,给大家作为学习参考。参考项目:82245 条评论分享收藏感谢收起25420 条评论分享收藏感谢收起Python爬虫初学(一)—— 爬取段子 - 简书
Python爬虫初学(一)—— 爬取段子
最近开始学Python的爬虫,是在跟着学习的,该博主用的是Python 2.7版本,而我使用的是3.5版本,很多不兼容的地方,不过没关系,自己改改就好了。
我们想针对网站的内容进行筛选,只获取自己感兴趣的部分。比如你想在XX网站把小黄图筛选出来,打包带走。这里只做简单的实现,以上的段子(纯文本)为例。我们想要实现如下功能:
批量下载若干页段子到本地文件中
按下任意一键,开始阅读下一条段子
1. 获取网页代码
导入urllib的相关库,Python 3中应该这样写:
import urllib.request
import urllib.parse
re库是正则表达式(Regular Expression),后面作匹配时会用到。
百思不得姐的段子页面url ='http://www.budejie.com/text/1',这里末尾数字1代表此为第一页。通过以下代码就能返回网页内容。
req = urllib.request.Request(url)
# 添加headers 使之看起来像浏览器在访问
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/52.0. Safari/537.36')
response = urllib.request.urlopen(req)
# 得到网页内容,注意必须使用decode()解码
html = response.read().decode('utf-8')
print(html)的话,就是如下所示的内容:
这能看?段子呢?我们想要的段子呢?!
哦对了headers这样查看。
按F12,然后...看图吧
2. 正则匹配提取段子
要想筛选符合普通人阅读的内容(如果还带着html标签那还咋读是不),成功提取出段子,为此我们需要一些既定的模式去和网页全部内容进行匹配,将模式下匹配成功的对象返回。我们使用强大的正则表达式进行匹配(Regular Expression),相关语法可以看。
仅仅针对本例中的网页内容,先看看我们需要的段子对应了网页中的什么内容。
可以看到段子被&div class="j-r-list-c-desc"&(我们要的内容)&/div&这样的标签所包围,只需要指定相应规则提取出来即可!上图可以看出段子正文前后是有很多空格的,需要匹配进去。
pattern = re.compile(r'&div class="j-r-list-c-desc"&\s+(.*)\s+&/div&')
result = re.findall(pattern, html)
通过re库的compile函数制定规则。
\s+可以匹配一个或更多的空格
.匹配除开换行符\n外的所有字符。
现在我们得到了匹配后的结果,来看下。
Bingo!提取出来了不是?!
可是我们发现里面还有些讨厌的&br /&。没关系,写几行代码的事。这里就不再展示去掉后的内容,自行脑补哈哈。
for each in content:
# 如果某个段子里有&br /&
if '&br /&' in each:
# 替换成换行符并输出
new_each = re.sub(r'&br /&', '\n', each)
print(new_each)
# 没有就照常输出
print(each)
这里content由get_content方法返回,表示所有获取到的段子列表。get_content方法下面会给出实现。
至此,我们成功得到我们想看的段子了!如果想要下载到本地呢?
3. 下载段子到本地
通过定义一个save()函数即可,num参数用户自定,想下载最近100页的内容都没问题!里面还有些变量没有提到,最后会给出源代码。
# num是指定网页页数
def save(num):
# 写方式打开一个文本,把获取的段子列表存放进去
with open('a.txt', 'w', encoding='utf-8') as f:
text = get_content(num)
# 和上面去掉&br /&类似
for each in text:
if '&br /&' in each:
new_each = re.sub(r'&br /&', '\n', each)
f.write(new_each)
f.write(str(each) + '\n')
下载到本地文档后如下图所示
4. 逐条读取段子
段子太多,琳琅满目。可我们只希望一条条阅读。通过按下键盘任意键可以切换到下一条,直到读取到最后一条程序才结束,或者通过设置一个退出键随时退出程序,比如设定q键退出。这里把全部代码给出。
import urllib.request
import urllib.parse
pattern = re.compile(r'&div class="j-r-list-c-desc"&\s+(.*)\s+&/div&')
# 返回指定网页的内容
def open_url(url):
req = urllib.request.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/52.0. Safari/537.36')
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
return html
# num为用户自定,返回的是所有页的段子列表
def get_content(num):
# 存放段子的列表
text_list = []
for page in range(1, int(num)):
address = 'http://www.budejie.com/text/' + str(page)
html = open_url(address)
result = re.findall(pattern, html)
# 每一页的result都是一个列表,将里面的内容加入到text_list
for each in result:
text_list.append(each)
return text_list
# num是指定网页页数
def save(num):
# 写方式打开一个文本,把获取的段子列表存放进去
with open('a.txt', 'w', encoding='utf-8') as f:
text = get_content(num)
# 和上面去掉&br /&类似
for each in text:
if '&br /&' in each:
new_each = re.sub(r'&br /&', '\n', each)
f.write(new_each)
f.write(str(each) + '\n')
if __name__ == '__main__':
print('阅读过程中按q随时退出')
number = int(input('想读几页的内容: '))
content = get_content(number + 1)
for each in content:
if '&br /&' in each:
new_each = re.sub(r'&br /&', '\n', each)
print(new_each)
print(each)
# 用户输入
user_input = input()
# 不区分大小写的q,输入则退出
if user_input == 'q' or user_input == 'Q':
演示一下,效果是这样的。
虽然功能很鸡肋,不过作为初学我还是很满意了,有兴趣才能深入下去嘛!爬虫可不仅仅如此而已,以后会学习更加高级的功能。
by @sunhaiyu
Java、Python、学生
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
Python 函数式编程入门教程 - 后端 - 掘金本文为作者原创,转载请先与作者联系。同发于博客园和 SegmentFault专栏 Functional Programming 引言 Functional Programming(函数式编程)的概念最早起源于LISP,由约...
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
版权声明:本文为作者原创文章,可以随意转载,但必须在明确位置表明出处!!! 通过上一遍文章我们对python的基础语法和正则表达式有了一定的了解,从这边文章开始我们将进入实战,大家不要害怕,学习爬虫我们首先要做的是定一个目标,要相信没有爬不下来的东西,毕竟网页都是人写得,它...
1 晚上,突然收到一条微信。一看,竟然是前公司上司发来的添加请求。我想着,既然知道我已将她删除好友,还要来主动加我,想必是有什么事情,于是立马加了对方,问有什么事。原来是想要我再回去上班。我想了一下,委婉拒绝了,并表示感谢。 M是我的前上司,属雷厉风行类。那时我刚转入新行业...
在开发Web服务时,只需要关注请求头If-None-Match、响应头ETag、响应头Cache-Control就足够了。因为这三个Http头就可以满足你的需求,并且,当今绝大多数的浏览器,都支持这三个Http头。我们所要做的就是,确保每个服务器响应都提供正确的 HTTP ...
最近清风算法来袭,大批站长在惶惶不安中开始检查自己的网站。其实很多人都陷入了过度优化的陷阱中而不自知,今天聚汇合一咨询就给大家分析一下从哪些方面来检测自己的网站是否过度优化。 过度优化,顾名思义就是当正常的优化手段堆积到过犹不及的地步时,本来应该受搜索引擎欢迎和喜爱的优化手...
导读:灵遁者最美的诗句,告诉你生活的深意和诗意! 你最喜欢的句子是那些? 你最喜欢的诗歌是那首。一起来读读这些句子! 我最喜欢的句子是:今晚,我只站在我自己的屋檐下!

我要回帖

更多关于 python爬虫怎么挣钱 的文章

 

随机推荐