Python 利用Python编写简单网络爬虫实例3
利用Python编写简单网络爬虫实例3
by:授客 QQ:1033553122
实验环境
python版本:3.3.5(2.7下报错
实验目的
获取目标网站“http://bbs.51testing.com/forum.php”中特定url,通过分析发现,目标url同其它url的关系如下



目标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")
结果:




声明:仅供学习研究使用,请勿用于其它非法用途
Python 利用Python编写简单网络爬虫实例3的更多相关文章
- Python 利用Python编写简单网络爬虫实例2
利用Python编写简单网络爬虫实例2 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://www.51testing. ...
- 使用Python编写简单网络爬虫抓取视频下载资源
我第一次接触爬虫这东西是在今年的5月份,当时写了一个博客搜索引擎.所用到的爬虫也挺智能的,起码比电影来了这个站用到的爬虫水平高多了! 回到用Python写爬虫的话题. Python一直是我主要使用的脚 ...
- 利用Java编写简单的WebService实例
使用Axis编写WebService比較简单,就我的理解,WebService的实现代码和编写Java代码事实上没有什么差别,主要是将哪些Java类公布为WebService. 以下是一个从编写測试样 ...
- 利用Java编写简单的WebService实例-转载
使用Axis编写WebService比较简单,就我的理解,WebService的实现代码和编写Java代码其实没有什么区别,主要是将哪些Java类发布为WebService.下面是一个从编写测试例子到 ...
- Python简单网络爬虫实战—下载论文名称,作者信息(下)
在Python简单网络爬虫实战—下载论文名称,作者信息(上)中,学会了get到网页内容以及在谷歌浏览器找到了需要提取的内容的数据结构,接下来记录我是如何找到所有author和title的 1.从sou ...
- python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容
python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...
- python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例
python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...
- 简单scrapy爬虫实例
简单scrapy爬虫实例 流程分析 抓取内容:网站课程 页面:https://edu.hellobi.com 数据:课程名.课程链接及学习人数 观察页面url变化规律以及页面源代码帮助我们获取所有数据 ...
- 【Python开发】【神经网络与深度学习】如何利用Python写简单网络爬虫
平时没事喜欢看看freebuf的文章,今天在看文章的时候,无线网总是时断时续,于是自己心血来潮就动手写了这个网络爬虫,将页面保存下来方便查看 先分析网站内容,红色部分即是网站文章内容div,可以看 ...
随机推荐
- Andrew Ng机器学习第三章——线性回归回顾
一些概念: 向量:向量在矩阵中表示为只有一列的矩阵 n维向量:N行1列的矩阵. 利用矩阵计算可以快速实现多种结果的计算. 如下图,给出四个房子大小的样本,有四个假设函数对房子价格进行预测.构造下面的矩 ...
- 放弃jQuery,使用原生js吧!
转自:http://itakeo.com/blog/2015/07/28/nojq/ 随着IE6.7.8的逐渐淘汰,HTML5的兴起,以及侧重点放在了移动端,jQuery可能变的不在那么重要,原生一样 ...
- 【Azure】Publish Error of "%(TargetOSFamily.Identity)" that evaluates to "" instead of a number
在向Azure部署程序的时候,出现如下错误: A numeric comparison was attempted on "%(TargetOSFamily.Identity)" ...
- openerp QWeb
1.web 模块 注意,OpenERP 模块中 web 部分用到的所有文件必须被放置在模块内的 static 文件夹里.这是强制性的,出于安全考虑. 事实上,我们创建的文件夹 CSS,JS 和 XML ...
- 2018春招-今日头条笔试题-第一题(python)
题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) 解题思路: 要想得到输入的数字列中存在相隔为k的数,可以将输入的数字加上k,然后判断其在不在输入的数字列中即可. #-*- cod ...
- asp.net MVC 多系统目录结构
学习了几天的mvc5,发现vs把所有的控制器都放在同一个目录Controllers目录下,细想一下,假如一个项目包含几个系统: 行政办公系统.培训管理系统.督办管理系统.会议管理系统…… 如果还把控制 ...
- 《构建之法》阅读笔记06-项目经理PM
软件团队里除了能写代码.测试代码和画图做设计的成员,还有一类角色,不做上面这些事情但也很重要,我们叫他们项目经理--PM. PM 的M 就是 Manager: P有这几种: Product Manag ...
- go语言接受者的选取
何时使用值类型 1.如果接受者是一个 map,func 或者 chan,使用值类型(因为它们本身就是引用类型).2.如果接受者是一个 slice,并且方法不执行 reslice 操作,也不重新分配内存 ...
- springboot-4-整合fastjson
使用fastjson作为springboot的默认json解析, 原来使用的是jackson 1, 引入依赖 <dependencies> <dependency> <g ...
- mongodb带认证的副本集搭建
Mongodb副本集带用户认证的 概述 本次实验是在一台虚拟机上做的,正式环境一定要分开实现,以免影响服务的正常使用和性能. 准备工作: 操作系统:centos7.2 Mongodb版本:3.4.1 ...