Python 利用Python编写简单网络爬虫实例2
利用Python编写简单网络爬虫实例2
by:授客 QQ:1033553122
实验环境
python版本:3.3.5(2.7下报错
实验目的
获取目标网站“http://www.51testing.com/html/index.html”中特定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_board_url(self, url_set, include):
board_url_set = set() #
用于存放版块url
while len(url_set) > 0:
url = url_set.pop()
if re.findall(include, url):
board_url_set.add(url)
return board_url_set
#
入口版块
转换前URL:http://www.51testing.com/?action_category_catid_90.html
#
入口版块的子版块,转换前URL:http://www.51testing.com/?action-category-catid-91
#
转换后URL:http://www.51testing.com/html/90/category-catid-90.html
#
入口版块及其子版块url转换
def convert_board_url(self, url_set, if_sub=False):
tmp_url_set = set()
for url in url_set:
str1 = re.findall("[?].+[\d]+", url)
str2 = re.findall("[?].+[-|_]+", url) #
存放url中需要被替换的字符串
if str1[0][-2:].isdigit():
var = str1[0][-2:]
else:
var = str1[0][-1:]
replace_str = "html/"+var+"/category-catid-"
url_new = url.replace("".join(str2), replace_str)
if if_sub:
#
如果为子版块,需要添加.html结尾字符串
url_new
= url_new + ".html"
tmp_url_set.add(url_new)
return tmp_url_set
#
翻页页面,转换前URL:http://www.51testing.com/?action-category-catid-91-page-2
#
转换后URL:http://www.51testing.com/html/91/category-catid-91-page-2.html
#
转换子版块下子页面的url
def convert_sub_page_url(self, url_set):
tmp_url_set = set()
for url in url_set:
str1 = re.findall("[?].+-catid-[\d]+", url)
str2 = re.findall("[?].+[-|_]catid", url) #
存放url中需要被替换的字符串
if str1[0][-2:].isdigit():
var = str1[0][-2:]
else:
var = str1[0][-1:]
replace_str = "html/"+var+"/category-catid"
url_new = url.replace("".join(str2), replace_str)
url_new = url_new + ".html"
tmp_url_set.add(url_new)
return tmp_url_set
#
获取web页面url下的帖子url
def get_title_url(self, url_set, include):
title_url_set = set() #
用于存放帖子url
while len(url_set) > 0:
url = url_set.pop()
if re.findall(include, url):
title_url_set.add(url)
return title_url_set
#
帖子,转换前URL:
#
转换后URL:http://www.51testing.com/?action-viewnews-itemid-1262758
#
转换帖子url:http://www.51testing.com/html/58/n-1262758.html
def conver_tilte_url(self, url_set):
tmp_url_set = set()
for url in url_set:
str1 = re.findall("[?].+[\d]+", url)
str2 = re.findall("[?].+[-|_]+", url) #
存放url中需要被替换的字符串
if str1[0][-2:].isdigit():
var = str1[0][-2:]
else:
var = str1[0][-1:]
replace_str = "html/"+var+"/n-"
url_new = url.replace("".join(str2), replace_str)
url_new = url_new + ".html"
tmp_url_set.add(url_new)
return tmp_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://www.51testing.com/html/index.html"
#
构造解析器
parser = MyHtmlParser(strict = False)
#
下载网页
print("program is downloading the frist url
page")
reptile = Reptile()
page = reptile.get_page(init_url, headers)
print("processing the first url page")
#
解析网页(获取url)
parser.feed(str(page))
#
获取入口版块url
pattern =
"http://www.51testing.com/[?]action[_|-]category[_|-]catid[_|-][\d]+[.]html"
include = re.compile(pattern)
board_url_set = reptile.get_board_url(parser.url_set,
include)
#
转换入口版块url
board_url_set_new =
reptile.convert_board_url(board_url_set)
#
获取每个入口版块下的子版块url("更多"页面)
pattern =
"http://www.51testing.com/[?]action[_|-]category[_|-]catid[_|-][\d]+$"
include = re.compile(pattern)
sub_board_url_set = set()
board_index = 1
for board_url in board_url_set_new:
page = reptile.get_page(board_url, headers)
parser.feed(str(page))
print("getting subboard urls in the %dth web board page" %
board_index)
tmp_url_set = reptile.get_board_url(parser.url_set,
include)
board_index = board_index + 1
sub_board_url_set = sub_board_url_set ^ tmp_url_set
#
转换入口版块的子版块的url
sub_board_url_set_new =
reptile.convert_board_url(sub_board_url_set, True)
#for url in sub_board_url_set_new:
#
print(url)
#
获取子版块的子页面url(点击数字页号翻页后的"页面",默认为前10页)
pattern =
"http://www.51testing.com/?action-category-catid-[\d]+-page-[\d]$"
include = re.compile(pattern)
sub_page_url_set = set()
board_index = 1
for sub_page_url in sub_board_url_set_new:
page = reptile.get_page(sub_page_url, headers)
parser.feed(str(page))
print("getting sub page urls in the %dth web page" %
board_index)
tmp_url_set = reptile.get_board_url(parser.url_set,
include)
board_index = board_index + 1
sub_page_url_set = sub_page_url_set ^ tmp_url_set
#for url in sub_page_url_set:
#
print(url)
#
转换子版块下的子页面url
sub_page_url_set =
reptile.convert_sub_page_url(sub_page_url_set)
#
获取所有web页面
web_page_set = sub_board_url_set_new ^
sub_page_url_set
#
获取页面文章
title_url_set = set()
board_index = 1
title_index = 1
for page_url in web_page_set:
page = reptile.get_page(page_url, headers)
parser.feed(str(page))
#
获取每个web页面下帖子url
pattern =
"http://www.51testing.com/[?]action-viewnews-itemid-[\d]+"
include = re.compile(pattern)
print("getting all title urls in the %dth web board" %
board_index)
tmp_url_set = reptile.get_title_url(parser.url_set,
include)
board_index = board_index + 1
title_url_set = title_url_set ^ tmp_url_set
title_url_set_new =
reptile.conver_tilte_url(title_url_set)
#
获取每篇文章下的目标url并写入文件
target_index = 1
title_index = 1
filepath = "d:/url2.txt"
for title_url in title_url_set_new:
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编写简单网络爬虫实例2的更多相关文章
- Python 利用Python编写简单网络爬虫实例3
利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://bbs.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,可以看 ...
随机推荐
- OpenCV --- 修改图像的对比度、亮度 、RGB转Gray图像、修改图像的尺寸
#include <opencv2/core.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/highgu ...
- Go语言学习笔记(3)——分支、循环结构
1 条件语句: if, else if, else 特殊用法:判断num是奇是偶:其中局部变量num只能在该if...else语句中使用! if num := 10; num % 2 == 0 { ...
- MySQL权限管理(五)
一.什么是MySQL权限 各大帖子及文章都会讲到数据库的权限按最小权限为原则,这句话本身没有错,但是却是一句空话.因为最小权限,这个东西太抽象,很多时候你并弄不清楚具体他需要哪些权限. 现在很多mys ...
- h5移动端聊天室|仿微信界面聊天室|h5多人聊天室
今年的FIFA世界杯甚是精彩,最近兴致高涨就利用HTML5开发了一个手机端仿微信界面聊天室,该h5聊天室采用750px全新伸缩flex布局,以及使用rem响应式配合fontsize.js,页面弹窗则是 ...
- 剑指offer五十三之表示数值的字符串
一.题目 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...
- django框架--视图系统
目录 一.视图函数的理解 二.视图函数的定位 三.请求对象HttpRequest 四.响应对象HttpResponse 一.视图函数的理解 视图函数的作用是,对指定的url执行业务逻辑,视图函数将会作 ...
- win7,8走网络打印机出现删除设备和打印机门未关闭的解决方法
不多说,直接上干货! 用学校的内网连接, 即可. 右键,查看设备网页. 出现下面的情况: 多学学. 欢迎大家,加入我的微信公众号:大数据躺过的坑 人工智能躺过的坑 同时,大家 ...
- LetExpr表达式解读
Integer a = 0; a++; 举个例子,如下: package com.test19; public class BugReport<T> { private T n; publ ...
- gulp4.0 前端构建脚手架
最近看了下gulp4.0的升级,感觉和3.0相比变化还是比较大的,很多3.0的写法和插件会出现一些莫名其妙的变化,详细的变化就先不说了,这里我直接把我配置好的代码拿过来吧,方便各位可以更好的学习和使用 ...
- Go语言学习笔记五: 条件语句
Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...