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

by:授客 QQ1033553122

实验环境

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的更多相关文章

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

    利用Python编写简单网络爬虫实例2 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://www.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. POJ 2339

    #include <iostream> #include <algorithm> #define MAXN 205 using namespace std; char _m[M ...

  2. rabbitmq系列一 之简单队列

    1. rabbitmq简介 rabbitmq是一个消息代理,或者讲是一个消息中间件.主要是用来接收和转发信息的,它是对消息不做任何处理的.MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写 ...

  3. easyUI的分页,只显示第X 共Y页。改为显示 第X 页 共Y页

    如下图,easyUI的分页,只显示第X 共Y页. 需求需要显示 第X 页 共Y页. 解决办法:在easyui-lang-zh_CN.js更改以下代码,即可.也就是在 “共{pages}页”前面加个 “ ...

  4. web前端导出csv文件

    前言 导出文件,使用最多的方式还是服务器端来处理.比如jsp 中使用response 的方式. 但是,有时候可能就想使用web 前端是否也可以把页面上的内容导出来呢? 比如说,导出页面的一个表格. 这 ...

  5. Xpath string()提取多个子节点中的文本

    <div> <ul class="show"> <li>275万购昌平邻铁三居 总价20万买一居</li> <li>00 ...

  6. 【Tomcat】使用记录

    同时绑定ipv4和ipv6 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout=&q ...

  7. 9.png图片制作详细教程

    1.背景自适应且不失真问题的存在      制作自适应背景图片是UI开发的一个广泛问题,也是界面设计师渴望解决的问题,我相信我们彼此都深有体会.      比如,列表的背景图一定,但是列表的高度随着列 ...

  8. C/C++ -- Gui编程 -- Qt库的使用 -- 对话框QDialog

    模态对话框 -----源文件main.cpp(工程QtDialog)----- #include "qtdialog.h" #include <QApplication> ...

  9. gles2.0环境的在windows上的建立

    这里也有一个视频来讲解,大家可以看下,可以多提问题,意见,建议 http://edu.csdn.net/course/detail/606 #include <Windows.h> #in ...

  10. vue-cli3.0配置接口代理

    根目录 新建   vue.config.js 文件,自动加载配置. // 作为配置文件,直接导出配置对象即可 module.exports = { devServer: { // 设置主机地址 hos ...