python网页爬虫例子_Python 利用Python编写简单网络爬虫实例3

利用Python编写简单网络爬虫实例3

by:授客 QQ:1033553122

实验环境

python版本:3.3.5(2.7下报错

实验目的

获取目标网站“http://bbs.51testing.com/forum.php”中特定url,通过分析发现,目标url同其它url的关系如下

1569452-20190117225439410-1990780992.png

1569452-20190117225448168-1031898334.png

sg_trans.gif

目标url存在子页面中的文章中,随机分布,我们要把它找出来

python脚本

#!/usr/bin/env python

# -*- coding:utf-8 -*-

from urllib.request import *

import gzip, re

from io import BytesIO

from html.parser import HTMLParser

# 爬虫类

class Reptile:

"""to download web pages"""

def __init__(self):

self.url_set = set() # 用于存储已下载过的页面url

self.data = ""

# 下载页面

def get_page(self, url, headers):

request = Request(url, headers=headers)

request.add_header('Accept-encoding', 'gzip') #下载经过gzip方式压缩后的网页,减少网络流量

try:

response = urlopen(request) # 发送请求报文

if response.code == 200: # 请求成功

page = response.read() # 读取经压缩后的页面

if response.info().get("Content-Encoding") == "gzip":

page_data = BytesIO(page)

gzipper = gzip.GzipFile(fileobj = page_data)

self.data = gzipper.read()

else:

print("gzip unused")

self.data = page_data # 网页未采用gzip方式压缩,使用原页面

except Exception:

pass

self.url_set.add(url)

return self.data

# 获取论坛目标版块url

def get_forum_url(self, url_set, home, include):

forum_url_set = set() # 用于存放版块url

while len(url_set) > 0:

url = url_set.pop()

if re.findall(include, url):

# 读取的版块url通常是forum-53-1.html形势的

url = home + url

forum_url_set.add(url)

return forum_url_set

# 获取版块url下的帖子url

def get_title_url(self, url_set, home, include):

title_url_set = set() # 用于存放帖子url

while len(url_set) > 0:

url = url_set.pop()

if re.findall(include, url):

# 读取的帖子url通常是thread-1044711-1-1.html形式的

url = home + url

title_url_set.add(url)

return title_url_set

# 解析器类

class MyHtmlParser(HTMLParser):

def reset(self):

HTMLParser.reset(self) # 注意顺序

self.url_set = set()

def handle_starttag(self, tag, attrs):

#self.url = []

url_list = [value for key, value in attrs if "href" ==

key]

if url_list:

for url in url_list:

self.url_set.add(url)

##############测试################

# 添加头域,伪装浏览器访问网站,防止一些网站拒绝爬虫访问

headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.1;

WOW64; rv:33.0) Gecko/20100101 Firefox/33.0"}

init_url = "http://bbs.51testing.com/forum.php"

# 构造解析器

parser = MyHtmlParser(strict = False)

# 下载网页

page_number = 1

print("program is downloading the frist url

page")

reptile = Reptile()

page = reptile.get_page(init_url, headers)

print("processing the %dth url page" %

page_number)

# 解析网页(获取url)

parser.feed(str(page))

# 获取分类版块url

home = "http://bbs.51testing.com/"

# 分成多个变量来写,主要是为了书写方便,排版友好

pattern1 =

"forum-122-[1-9]|forum-243-[1-9]|forum-40-[1-9]|forum-63-[1-9]"

pattern2 =

"|forum-42-[1-9]|forum-53-[1-9]|forum-275-[1-9]|forum-140-[-9]"

pattern3 =

"|forum-138-[1-9]|forum-139-[1-9]|forum-141-[1-9]"

pattern = pattern1 + pattern2 + pattern3

include = re.compile(pattern)

forum_url_set = reptile.get_forum_url(parser.url_set, home,

include)

# 循环,获取每个分类版块下,1-10子版块的url(前10页)(翻页页面)

result_url_set = set()

forum_index = 1

for forum_url in forum_url_set:

page = reptile.get_page(forum_url, headers)

parser.feed(str(page))

print("getting the board urls in the %dth forum page" %

forum_index)

tmp_url_set = reptile.get_forum_url(parser.url_set, home,

include)

forum_index = forum_index + 1

result_url_set = result_url_set ^ tmp_url_set

title_url_set = set()

forum_index = 1

title_index = 1

for forum_url in result_url_set:

page = reptile.get_page(forum_url, headers)

parser.feed(str(page))

# 获取版块下的帖子url

pattern1 = "thread-[0-9]{7}-[0-9]{1}-[0-9]{1}[.]html|"

pattern2 = "thread-[0-9]{6}-[0-9]{1}-[0-9]{1}[.]html|"

pattern3 = "thread-[0-9]{7}-[0-9]{1}-[0-9]{2}[.]html|"

pattern4 = "thread-[0-9]{6}-[0-9]{1}-[0-9]{2}[.]html"

pattern = pattern1 + pattern2 + pattern3 + pattern4

include = re.compile(pattern)

print("getting all title urls in the %dth forum board" %

forum_index)

tmp_url_set = reptile.get_title_url(parser.url_set, home,

include)

forum_index = forum_index + 1

title_url_set = title_url_set ^ tmp_url_set

# 获取目标url

target_index = 1

title_index = 1

filepath = "d:/url.txt"

for title_url in title_url_set:

print("processing the %dth title url" % title_index)

page = reptile.get_page(title_url, headers)

parser.feed(str(page))

# 保存目标url

with open(filepath, "a") as f:

while len(parser.url_set) > 0:

url = parser.url_set.pop()

pattern =

"http://bbs.51testing.com/treasure/treasure.php[?]trenum=[0-9]{5}"

include = re.compile(pattern)

flag = re.findall(include, url)

if flag:

print("find target! saving the %dth target url in the %dth title

page" % (target_index, title_index))

f.write("the %dth url: %s" % (target_index, url))

target_index = target_index + 1

f.write("\n")

title_index = title_index + 1

print("complete")

结果:

1569452-20190117225513719-170320642.png

sg_trans.gif

1569452-20190117225521691-1441197216.png

sg_trans.gif

声明:仅供学习研究使用,请勿用于其它非法用途

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

登陆SharePoint站点出现service unavailable----Http错误503

今天在登陆SharePoint站点时,遇到服务不可用,Http error 503。建议如下操作: 1. 在IIS中检查站点属性。在“起始页”,检查应用程序池。 2. 发现SharePoint Web Services Root已停止,右键启动。问题得到解决。 PS&#…

C# 数组

什么是数组?数组是一种数据结构,包含同一个类型的多个元素。数组的声明:int[] myIntArray; 注:声明数组时,方括号 ([]) 必须跟在类型后面,而不是变量名后面。在 C# 中,将方括号放在变量名后是不…

Downloading Android Source Code

Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的分布式版本控制软件,它不同于Subversion、CVS这样的集中式版本控制系统。在集中式版本控制系统中只有一个仓 库(repository),许多个工作目录&#xff08…

第5章 Python 数字图像处理(DIP) - 图像复原与重建6 - 椒盐噪声

标题椒盐噪声椒盐噪声 如果kkk是一幅数字图像中表示灰度值的比特数,则灰度值可能是[0,2k−1][0, 2^k -1][0,2k−1]。椒盐噪声的PDF为: P(z){Ps,z2k−1Pp,z01−(PsPp),zV(5.16)P(z) \begin{cases} P_s, & z 2^k -1 \\ P_p, & z0 \\ 1-(P_s P_…

Keras 深度学习框架中文文档

2019独角兽企业重金招聘Python工程师标准>>> Keras深度学习框架中文文档 Keras官网:http://keras.io/Github项目:https://github.com/fchollet/keras中文文档主页:http://keras-cn.readthedocs.io/en/latest/Github中文文档&#…

求一个二维数组外围元素之和_C++数组作为函数的参数(学习笔记:第6章 04)...

数组作为函数的参数[1]数组元素作实参,与单个变量一样。数组名作参数,形、实参数都应是数组名(实质上是地址,关于地址详见后续章节),类型要一样,传送的是数组首地址。对形参数组的改变会直接影响…

android p wifi一直在扫描_Android再次解读萤石云视频

点击上方蓝字关注 ??前言我之前写过一篇萤石云的集成文章,很多人问我有没有demo, 今天我再次总结一下, 并加个些功能。集成步骤视频预览播放视频放大缩小视频的质量切换截图之前的文章大家可以看下面的链接:https://mp.weixin.q…

第5章 Python 数字图像处理(DIP) - 图像复原与重建7 - 周期噪声 余弦噪声生成方法

标题周期噪声周期噪声 周期噪声通常是在获取图像期间由电气或机电干扰产生的 def add_sin_noise(img, scale1, angle0):"""add sin noise for imageparam: img: input image, 1 channel, dtypeuint8param: scale: sin scaler, smaller than 1, will enlarge, …

第5章 Python 数字图像处理(DIP) - 图像复原与重建8 - 估计噪声参数

标题估计噪声参数估计噪声参数 周期噪声的参数通常是通过检测图像的傅里叶谱来估计的。 只能使用由传感器生成的图像时,可由一小片恒定的背景灰度来估计PDF的参数。 来自图像条带的数据的最简单用途是,计算灰度级的均值和方差。考虑由SSS表示的一个条…

python 随机获取数组元素_Python创建二维数组的正确姿势

List (列表)是 Python 中最基本的数据结构。在用法上,它有点类似数组,因为每个列表都有一个下标,下标从 0 开始。因此,我们可以使用 list[1] 来获取下标对应的值。如果我们深入下列表的底层原理&#xff0c…

在ubunut下使用pycharm和eclipse进行python远程调试

我比较喜欢Pycharm,因为这个是JetBrains公司出的python IDE工具,该公司下的java IDE工具——IDEA,无论从界面还是操作上都甩eclipse几条街,但项目组里有些人使用eclipse比较久了,一时让他们转pycharm比较困难&#xff…

CSS:页脚紧贴底部

2019独角兽企业重金招聘Python工程师标准>>> 我的练习来源于《CSS揭秘》这本书第7章-41紧贴底部的页脚这部分内容以及书中提到的链接。 方案一 描述:以下方案简单、干净、现代并且没有hack,适用于IE8, Chrome, Firefox, Opera等浏览器&#x…

第5章 Python 数字图像处理(DIP) - 图像复原与重建9 - 空间滤波 - 均值滤波器 - 算术平均、几何平均、谐波平均、反谐波平均滤波器

标题只存在噪声的复原 - 空间滤波均值滤波器算术平均滤波器几何均值滤波器谐波平均滤波器反(逆)谐波平均滤波器只存在噪声的复原 - 空间滤波 仅被加性噪声退化 g(x,y)f(x,y)η(x,y)(5.21)g(x, y) f(x, y) \eta(x, y) \tag{5.21}g(x,y)f(x,y)η(x,y)(5…

第5章 Python 数字图像处理(DIP) - 图像复原与重建10 - 空间滤波 - 统计排序滤波器 - 中值、最大值、最小值、中点、修正阿尔法均值滤波器

标题统计排序滤波器中值、最大值、最小值、中点 滤波器修正阿尔法均值滤波器统计排序滤波器 中值、最大值、最小值、中点 滤波器 f^(x,y)median{g(r,c)}(5.27)\hat{f}(x, y) \text{median} \{g(r,c)\} \tag{5.27}f^​(x,y)median{g(r,c)}(5.27) f^(x,y))max{g(r,c)}(5.28)\ha…

如何设置坐标原点值_氨气检测仪电化学原理及报警值如何设置

氨气体检测仪检定规程:一般氨气体检测仪检定规程主要是针对技术参数设定的一些标准,具体包含有规程的名称和范围、仪器示值误差、充分性标准差、响应时间、稳定性、报警功能、流量控制器、检定项目表、检定操作有数值误差、重复性、响应时间、稳定性等。…

第5章 Python 数字图像处理(DIP) - 图像复原与重建11 - 空间滤波 - 自适应滤波器 - 自适应局部降噪、自适应中值滤波器

标题自适应滤波器自适应局部降噪滤波器自适应中值滤波器自适应滤波器 自适应局部降噪滤波器 均值是计算平均值的区域上的平均灰度,方差是该区域上的图像对比度 g(x,y)g(x, y)g(x,y)噪声图像在(x,y)(x, y)(x,y)处的值 ση2\sigma_{\eta}^2ση2​ 为噪声的方差&am…

关闭防火墙_从零开始学Linux运维|09.关闭防火墙和SElinux

firewalld是centos7默认的防火墙安全增强型 Linux(Security-Enhanced Linux)简称 SELinux初学者建议先关闭,等熟悉了之后再来使用前期联系中的好多错误都有可能是由于没有关闭或者正确配置上面两项造成的1.临时关闭centos7下的防火墙firewalld一行命令就能够关闭firewalld--&qu…

Discuz!NT - 在线显示列表 游客 bug 修复

引发bug的条件:当你修改了系统组里面的[游客]组 的名字后!! 你会发现首页上底部的在线显示列表里始终都是显示"游客"字样而非你改过得字样!如图 至此你需要运行一个t-sql脚本去修复这个bug!(但是…

基于空间方法的图神经网络模型_用于时空图建模的图神经网络模型 Graph WaveNet | 课程上新...

课程概要本课程来自集智学园图网络论文解读系列活动。是对论文《Graph WaveNet for Deep Spatial-Temporal Graph Modeling》的解读。时空图建模 (Spatial-temporal graph modeling)是分析系统中组成部分的空间维相关性和时间维趋势的重要手段。已有算法大多基于已知的固定的图…

dataframe类型数据的遍历_Python零基础入门到爬虫再到数据分析,这些你都是要学会的...

1.必须知道的两组Python基础术语A.变量和赋值Python可以直接定义变量名字并进行赋值的,例如我们写出a 4时,Python解释器干了两件事情:在内存中创建了一个值为4的整型数据在内存中创建了一个名为a的变量,并把它指向4用一张示意图表…