手动爬虫之糗事百科(ptyhon3)
一、调用封装的Url_ProxyHelper类,源码如下
import urllib.request as ur class Url_ProxyHelper:
def __init__(self, url, proxy_add, savepath=None):
self.url = url
self.proxy_add = proxy_add
self.req = None
self.proxy = None
self.opener = None
self.info = None
self.save_path = savepath # 报头代理设置
def set_UrlAndProxy(self):
# 添加报头
self.req = ur.Request(self.url)
self.req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0') # 设置代理服务器
self.proxy = ur.ProxyHandler({'http': self.proxy_add})
self.opener = ur.build_opener(self.proxy, ur.HTTPHandler)
ur.install_opener(self.opener)
return self.req # 数据存档
def save_InFile(self):
self.req = self.set_UrlAndProxy()
self.info = ur.urlopen(self.req).read()
open(self.save_path, 'wb').write(self.info) # 数据返回
def feedbak_info(self):
self.req = self.set_UrlAndProxy()
self.info = ur.urlopen(self.req).read().decode('utf-8') # decode()用来解码,特别是中文
return str(self.info)
二、爬取源码
import urllib.request as ur
import re
from Url_ProxyHelper import Url_ProxyHelper # 构造了一个去除Tags的函数
def delete_Tags(content, pattern):
return re.sub(pattern, "", content.replace("\n", "")) # 设置目标网址
url = ur.quote("https://www.qiushibaike.com/", safe='/:?=', encoding='utf-8')
# 设置代理服务器IP
proxy_add = "114.239.147.6:808" # 调用Url_ProxyHelper类
uph = Url_ProxyHelper(url, proxy_add)
info = uph.feedbak_info() # 设置正则表达式
pattern_1 = 'target="_blank" title="(.*?)">'
pattern_2 = 'class="content">(.*?)</div>'
pattern_3 = '<(.*?)>' # 匹配数据
user_list = re.compile(pattern=pattern_1, flags=re.S).findall(info)
content_list = re.compile(pattern=pattern_2, flags=re.S).findall(info) for user, content in zip(user_list, content_list):
data = {
"user": user,
"content": delete_Tags(content, pattern_3)
}
print("用户是:" + data["user"])
print("内容是:" + data["content"])
三、一点总结
1.关于urllib.request.urlopen("www.x.com").read()是否调用decode("utf-8")。
答:一般而言,当我们抓取一个页面需要将该信息存档(如存为x.html文件)时,这个时候不能调用decode()函数;而当我们需要读取页面的信息时(这里指的是抓取页面部分内容),存在信息的转码,所以这个时候需要调用decode()函数。
2.在正则表达式的使用过程中,需要注意,re.compile(pattern).findall(info)中的info必须是str类型,所有当出现报错时,需要稍微转换一下。
3.正则表达式中,re.compile(pattern=pattern, flags=re.S)的第二个参数的使用,模式修正,防止有用信息被过滤掉。
4.函数的构建必须放在函数调用之前。
手动爬虫之糗事百科(ptyhon3)的更多相关文章
- 爬虫_糗事百科(scrapy)
糗事百科scrapy爬虫笔记 1.response是一个'scrapy.http.response.html.HtmlResponse'对象,可以执行xpath,css语法来提取数据 2.提取出来的数 ...
- Python爬虫_糗事百科
本爬虫任务: 爬虫糗事百科网站(https://www.qiushibaike.com/)--段子版块中所有的[段子].[投票数].[神回复]等内容 步骤: 通过翻页寻找url规律,构造url列表 查 ...
- <爬虫实战>糗事百科
1.糗事百科段子.py # 目标:爬取糗事百科段子信息(文字) # 信息包括:作者头像,作者名字,作者等级,段子内容,好笑数目,评论数目 # 解析用学过的几种方法都实验一下①正则表达式.②Beauti ...
- 21天打造分布式爬虫-Spider类爬取糗事百科(七)
7.1.糗事百科 安装 pip install pypiwin32 pip install Twisted-18.7.0-cp36-cp36m-win_amd64.whl pip install sc ...
- python_爬虫一之爬取糗事百科上的段子
目标 抓取糗事百科上的段子 实现每按一次回车显示一个段子 输入想要看的页数,按 'Q' 或者 'q' 退出 实现思路 目标网址:糗事百科 使用requests抓取页面 requests官方教程 使用 ...
- 利用python的爬虫技术爬去糗事百科的段子
初次学习爬虫技术,在知乎上看了如何爬去糗事百科的段子,于是打算自己也做一个. 实现目标:1,爬取到糗事百科的段子 2,实现每次爬去一个段子,每按一次回车爬取到下一页 技术实现:基于python的实现, ...
- python3 爬虫---爬取糗事百科
这次爬取的网站是糗事百科,网址是:http://www.qiushibaike.com/hot/page/1 分析网址,参数''指的是页数,第二页就是'/page/2',以此类推... 一.分析网页 ...
- 芝麻HTTP:Python爬虫实战之爬取糗事百科段子
首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致之前的代码没法用了,会导致无法输出和CPU占用过高的 ...
- Python爬虫-爬取糗事百科段子
闲来无事,学学python爬虫. 在正式学爬虫前,简单学习了下HTML和CSS,了解了网页的基本结构后,更加快速入门. 1.获取糗事百科url http://www.qiushibaike.com/h ...
随机推荐
- sklearn 中模型保存的两种方法
一. sklearn中提供了高效的模型持久化模块joblib,将模型保存至硬盘. from sklearn.externals import joblib #lr是一个LogisticRegressi ...
- Linux中history历史命令使用方法详解
当你在玩Linux的时候,如果你经常使用命令行来控制你的Linux系统,那么有效地使用命令历史机制将会使效率获得极大提升.事实上,一旦你掌 握了我在下面给出的15个有关Linux history历史命 ...
- Java并发编程(七):线程安全策略
Java多线程——不可变对象 Java多线程——线程封闭 java线程不安全类与写法 Java线程安全同步容器 Java里的并发容器与安全共享策略总结
- Android-->Realm(数据库ORM)使用体验,lambda表达式
Realm,为移动设备而生.替代 SQLite 和 Core Data. 非常庆幸,官方帮助文档有中文: https://realm.io/cn/docs/java/latest/ 尽管眼下最新的版本 ...
- 李洪强iOS开发之Xcode快捷键
14个Xcode中常用的快捷键操作 在Xcode 6中有许多快捷键的设定可以使得你的编程工作更为高效,对于在代码文件中快速导航.定位Bug以及新增应用特性都是极有效的. 当然,你戳进这篇文章的目的 ...
- 5.14日学习内容1:jquery表单相关知识
<script> $comment.animate({height:'+=50'},400);//在原来的基础上加50: $('.smaller').click(function(){ i ...
- protobuf java学习
本文档为java编程人员使用protocol buffer提供了一个基本的介绍,通过一个简单的例程进行介绍.通过本文,你可以了解到如下信息: 1.在一个.proto文件中定义一个信息格式. 2.使用p ...
- linux系统中-E,-S,-c的区别和作用(怎么讲代码转化为机器识别的语言)
1707 许多初学者都有比较大的疑惑,电脑是怎么识别我们写的代码并进行处理的呢?其实这个问题对我们初学者来说是很重要的,只有了解机器的运行原理,我们才能真正地学号留下.那么今天我就以此为题为大家略讲一 ...
- 如何在调试Window App时,触发 Suspending ,Resuming 等事件
Visual Studio prevents Windows from suspending an app that is attached to the debugger. This is to a ...
- 支付宝API接口开发相关文档以及实例
支付宝实物即时到账接口,在下载该接口之前,请确定你已经签约了即时到账的服务协议,并且账号已经开通了即时到账的权限. 口常见错误问题搜集:http://union.alipay.com/alipay/z ...