Python自学笔记——多线程微信文章爬取

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

"""

Created on Tue Dec 26 10:34:09 2017

@author: Andrew

"""

#线程1专门获取对应网址并处理为真是网址,然后将网址写入队列urlqueue中,该队列专门用来存放具体文章的网址

#线程2与线程1并行,从线程1提供的网址中依次爬取对应文章信息并处理,处理后将我们需要的结果写入对应的本地文件中

#线程3主要用于判断程序是否完成。因为在此如果没有一个总体控制的线程,即使线程1、2执行完,也不会退出程序

#在正规的项目设计时,尽量并行执行的线程执行的时间相近

#建立合理的延时机制,如:发生异常或让执行较快的线程进行延时。

#建立合理的异常处理机制

导入所需的模块

import threading

import queue

import re

import urllib.request

import time

import urllib.error

#创建一个网址队列

urlqueue=queue.Queue()

#模拟成浏览器

headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36")

opener.add_handler=[headers]

#将opener安装为全局

#建立空url列表

listurl=[]

#读取网页源代码

def readdata(url):

try:

return data

except urllib.error.URLError as e:

if hasattr(e,"code"):

print(e.code)

if hasattr(e,"reason"):

print(e.reason)

time.sleep(10)

except Exception as e:

print("exception:"+str(e))

time.sleep(1)

#线程1,专门获取对应网址并处理为真实网址

class geturl(threading.Thread):

def __init__(self,key,pagestart,pageend,urlqueue):

threading.Thread.__init__(self)

self.pagestart=pagestart

self.pageend=pageend

self.urlqueue=urlqueue

def run(self):

page=self.pagestart

#编译关键词key

for page in range(self.pagestart,self.pageend+1):

data1=readdata(url)

#列表页url正则

listurlpat='

.*?(http://.*?)"'

listurl.append(re.compile(listurlpat,re.S).findall(data1))

#便于调试

print("获取到"+str(len(listurl))+"页")

for i in range(0,len(listurl)):

#等一等线程2,合理分配资源

time.sleep(7)

for j in range(0,len(listurl[i])):

try:

url=listurl[i][j]

#处理成真实url,采集网址比真实网址多了一串"amp;"

url=url.replace("amp;","")

print("第"+str(i)+","str(j)+"次入队")

except urllib.error.URLError as e:

if hasattr(e,"code"):

print(e.code)

if hasattr(e,"reason"):

print(e.reason)

#若为URLError异常,延时10秒执行

time.sleep(10)

except Exception as e:

print("exception:"+str(e))

#若为Exception异常,延时1秒执行

time.sleep(1)

#线程2,与线程1并行,从线程1提供的网址urlqueue中依次爬去对应文章信息并处理

class getcontent(threading.Thread):

def __init__(self,urlqueue):

threading.Thread.__init__(self)

self.urlqueue=urlqueue

def run(self):

html='''

fh=open("C:/Python35/3.html","wb")

fh.write(html.encode("utf-8"))

fh.close()

fh=open("C:/Python35/3.html","ab")

i=1

while(True):

try:

data=readdata(url)

#文章标题正则表达式

titlepat="(.*?)"

#文章内容正则表达式

contentpat='id="js_content">(.*?)id="js_sg_bar"'

#通过对应正则表达式找到标题并赋给列表title

title=re.compile(titlepat).findall(data)

#通过对应正则表达式找到内容并赋给content

content=re.compile(contentpat,re.S).findall(data)

#初始化标题与内容

thistitle="此次没有获取到"

thiscontent="此次没有获取到"

#如果标题列表不为空,说明找到了标题,去列表第0个元素,即次标题赋给thistitle

if(title!=[]):

thistitle=title[0]

if(thiscontent!=[]):

thiscontent=content[0]

#将标题与内容汇总赋给变量dataall

dataall="

标题为:"+thistitle+"

内容为:"+thiscontent+"

"

#将该篇文章的标题与内容的总信息写入对应文件

fh.write(dataall.encode("utf-8"))

print("第"+str(i)+"个网页")#便于调试

i+=1

except urllib.error.URLError as e:

if hasattr(e,"code"):

print(e.code)

if hasattr(e,"reason"):

print(e.reason)

#若为URLError异常,延时10秒执行

time.sleep(10)

except Exception as e:

print("exception:"+str(e))

#若为Exception异常,延时1秒执行

time.sleep(1)

fh.close()

html4='''

'''

fh=open("C:/Python35/3.html","ab")

fh.write(html4.encode("utf-8"))

fh.close()

#并行控制程序,若60秒未响应,并且url的队列已空,则判断为执行成功

class contrl(threading.Thread):

def __init__(self,urlqueue):

threading.Thread.__init__(self)

self.urlqueue=urlqueue

def run(self):

while(True):

print("程序执行中")

time.sleep(60)

print("程序执行完毕!")

exit()

#运行

key="考研数学泄题"

pagestart=1#起始页

pageend=2#爬取到哪页

#创建线程1对象,随后启动线程1

t1=geturl(key,pagestart,pageend,urlqueue)

t1.start()

#创建线程2对象,随后启动线程2

t2=getcontent(urlqueue)

t2.start()

#创建线程3对象,随后启动线程3

t3=contrl(urlqueue)

t3.start()

本文来自企鹅号 - 包子馒头铺媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

.net 2.0 你是如何使用事务处理?

     事务处理作为企业级开发必备的基础设施, .net 2.0通过System.Transactions对事务提供强大的支持.你还是在使用.net 1.x下...

23060
来自专栏程序员八阿哥

王老板Python面试(9):整理的最全 python常见面试题(基本必考)

1)迭代器是一个更抽象的概念,任何对象,如果它的类有next方法和iter方法返回自己本身。对于string、list、dict、tuple等这类容器对象,使用...

26910
来自专栏java思维导图

开源项目renren-fast解读,让java不再难懂(二)

1、百度百科的解释: XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览...

31840
来自专栏高性能服务器开发

从零实现一个http服务器

我始终觉得,天生的出身很重要,但后天的努力更加重要,所以如今的很多“科班”往往不如后天努力的“非科班”。所以,我们需要重新给“专业”和“专家”下一个定义:所谓专...

40620
来自专栏安富莱嵌入式技术分享

【RL-TCPnet网络教程】第36章 RL-TCPnet之FTP服务器

本章节为大家讲解RL-TCPnet的FTP服务器应用,学习本章节前,务必要优先学习第35章的FTP基础知识。有了这些基础知识之后,再搞本章节会有事半功倍的效果。

9900
来自专栏yukong的小专栏

【ssm个人博客项目实战08】博客的分页显示以及模糊查询,删除。前言1、上篇回顾2、具体编码3、测试与小结

在上一节中我们是完成了博客的回台部分,现在我需要在前台拿到回台传来的数据并且给以显示出来。 不知道大家还记得我们在博客类别管理里面,easyui的datagr...

13940
来自专栏同步博客

Memcache存储机制与指令汇总

  memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

10920
来自专栏Seebug漏洞平台

利用 phar 拓展 php 反序列化漏洞攻击面

通常我们在利用反序列化漏洞的时候,只能将序列化后的字符串传入unserialize(),随着代码安全性越来越高,利用难度也越来越大。但在不久前的Black Ha...

20950
来自专栏我的技术专栏

《Go in action》读后记录:Go的并发与并行

10530
来自专栏点滴积累

Jupyter(Python)中无法使用Cache原理分析

前言 最近需要在Jupyter中写一个类库,其中有一个文件实现从数据库中读取空间数据并加载为Feature对象,Feature对象是cartopy封装的geom...

36360

扫码关注云+社区

领取腾讯云代金券