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

by:授客 QQ1033553122

实验环境

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

   
#

入口版块

转换前
URLhttp://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

 

   
#

翻页页面,转换前
URLhttp://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

   
#

转换后
URLhttp://www.51testing.com/?action-viewnews-itemid-1262758

   
#

转换帖子
urlhttp://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的更多相关文章

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

    利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://bbs.51testing. ...

  2. 使用Python编写简单网络爬虫抓取视频下载资源

    我第一次接触爬虫这东西是在今年的5月份,当时写了一个博客搜索引擎.所用到的爬虫也挺智能的,起码比电影来了这个站用到的爬虫水平高多了! 回到用Python写爬虫的话题. Python一直是我主要使用的脚 ...

  3. 利用Java编写简单的WebService实例

    使用Axis编写WebService比較简单,就我的理解,WebService的实现代码和编写Java代码事实上没有什么差别,主要是将哪些Java类公布为WebService. 以下是一个从编写測试样 ...

  4. 利用Java编写简单的WebService实例-转载

    使用Axis编写WebService比较简单,就我的理解,WebService的实现代码和编写Java代码其实没有什么区别,主要是将哪些Java类发布为WebService.下面是一个从编写测试例子到 ...

  5. Python简单网络爬虫实战—下载论文名称,作者信息(下)

    在Python简单网络爬虫实战—下载论文名称,作者信息(上)中,学会了get到网页内容以及在谷歌浏览器找到了需要提取的内容的数据结构,接下来记录我是如何找到所有author和title的 1.从sou ...

  6. python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容

    python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...

  7. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  8. 简单scrapy爬虫实例

    简单scrapy爬虫实例 流程分析 抓取内容:网站课程 页面:https://edu.hellobi.com 数据:课程名.课程链接及学习人数 观察页面url变化规律以及页面源代码帮助我们获取所有数据 ...

  9. 【Python开发】【神经网络与深度学习】如何利用Python写简单网络爬虫

    平时没事喜欢看看freebuf的文章,今天在看文章的时候,无线网总是时断时续,于是自己心血来潮就动手写了这个网络爬虫,将页面保存下来方便查看   先分析网站内容,红色部分即是网站文章内容div,可以看 ...

随机推荐

  1. Window History对象

    History 对象属性 length 返回浏览器历史列表中的 URL 数量. History 对象方法 back() 加载 history 列表中的前一个 URL. window.history.b ...

  2. (转)Jupyter notebook入门教程(上,下)

    https://blog.csdn.net/red_stone1/article/details/72858962------上 https://blog.csdn.net/red_stone1/ar ...

  3. (转) centos 7.0 nginx 1.7.9成功安装过程

    centos 7.0根目录 的目录构成 [root@localhost /]# lsbin dev home lib64 mnt proc run srv tmp varboot etc lib me ...

  4. log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.o

    上面的报错是在本地java调试(windows) hadoop集群 出现的 解决方案: 在resources文件夹下面创建一个文件log4j.properties(这个其实hadoop安装目录下的 e ...

  5. Dubbo-使用Maven构建Dubbo服务的可执行jar包

    一.为什么要构建Dubbo服务的可执行jar包? 1.1 Dubbo服务运行方式比较 ✎使用Servlet容器运行(Tomcat.Jetty等)  ---不可取 --缺点:增加复杂性(多了容器的端口) ...

  6. 【C#小知识】C#中一些易混淆概念总结(八)---------解析接口 分类: C# 2014-02-18 00:09 2336人阅读 评论(4) 收藏

     这一篇主要来解析关于面向对象中最总要的一个概念--接口. 对于接口来说,C#是有规定使用Interface关键字来声明接口.它的声明是和类一致的.可以说接口就是一个特殊的抽象类.如下代码: cl ...

  7. WordPress导航菜单函数

    导航菜单是每一个WordPress主题必须的元素,如果你要制作一个WordPress主题,那就必须熟悉WordPress导航菜单注册函数 register_nav_menus() 和 导航菜单调用函数 ...

  8. web前端之css快速入门

    css简介 css概述 CSS 指层叠样式表 (Cascading Style Sheets)样式定义如何显示 HTML 元素样式通常存储在样式表中把样式添加到 HTML 4.0 中,是为了解决内容与 ...

  9. LDAP落地实战(三):GitLab集成OpenLDAP认证

    上一篇文章介绍了svn集成OpenLDAP认证,版本控制除了svn外,git目前也被越来越多的开发者所喜爱,本文将介绍GitLab如何集成openldap实现账号认证 GitLab集成OpenLDAP ...

  10. Java 集合框架(二)—— ArrayList

    二.数组列表 —— ArrayList 1.构造方法 ArrayList 是 Java 中的动态数组,底层实现就是对象数组,只不过数组的容量会根据情况来改变. 它有个带 int 类型参数的构造方法,根 ...