一个简单的进程池版的爬虫程序

# http://www.doutula.com/article/list/?page=1 第一页
# http://www.doutula.com/article/list/?page=2 翻页

# <a href="http://www.doutula.com/article/detail/1535518" class="list-group-item random_list"> # # 首页中具体包链接

# <img src="http://ww1.sinaimg.cn/large/9150e4e5ly1flj1mvb3hcj20c809cjrm.jpg" alt="猫爪" onerror="this.src=‘http://img.doutula.com/production/uploads/image/2017/11/15/20171115749279_RPFWHq.jpg‘"> #图片链接

# 匹配多行 reg = re.compile(reg,re.S)

#这里是需要的python包
import requests

import time

import gevent

import re

import os

from gevent import monkey

# monkey.patch_all()

# 1.每页的url从1-531,使用for循环 拼接url

# 2.打开url之后,使用正则findall抓取该页的具体包链接 ,存入package_list

def get_pic_url(page):

try:

os.mkdir(str(page))

except Exception as e:

pass

head = {

‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.91 Safari/537.36‘}

url = ‘http://www.doutula.com/article/list/?page={}‘.format(page)

res = requests.get(url,headers = head)

tmp = re.findall(r‘<a href="([^#].*?)" class=".*?">‘,res.text)

print(tmp)

package_list.extend(tmp)

# 3.使用for循环遍历package_list 作为picture_url

# 4.打开改url ,然后抓取url中的表情jpg,存入本地文件夹或者数据库

for pic_url in package_list:

if len(pic_url) != len(‘http://www.doutula.com/article/detail/1070805‘):

break

else:

res_pic = requests.get(pic_url,headers = head)

reg = r‘‘‘<img src="(.*?)" alt="(.*?)" .*?>‘‘‘

reg = re.compile(reg,re.S)

tmp = re.findall(reg,res_pic.text)

print(tmp)

for i in tmp:

num = tmp.index(i)

picture_res = requests.get(i[0],headers = head)

string = ‘‘

if picture_res:

tmp_str = i[1]

for each in tmp_str:

if each in (‘\\‘,‘/‘,‘*‘,‘?‘,‘"‘,‘|‘,‘>‘,‘<‘):

pass

else:

string = string + each

tmp_str = string

if i[0][-3:] == ‘jpg‘:

with open(r‘./{}/{}-{}{}.jpg‘.format(page,package_list.index(pic_url),num,tmp_str),‘wb‘) as f:

f.write(picture_res.content)

time.sleep(1)

else:

with open(r‘./{}/{}-{}{}.gif‘.format(page,package_list.index(pic_url),num,tmp_str),‘wb‘) as f:

f.write(picture_res.content)

time.sleep(1)

else:

break

def f1(): #1-265

for page in range(1,532):

package_list.clear()

get_pic_url(page)

package_list = []

f1()

#

# def f2(): # 266-531

# for page in range(266,531):

# get_pic_url(page)

#

# g1 = gevent.spawn(f1)

# g2 = gevent.spawn(f2)

# g1.join()

# g2.join()

原文地址:https://www.cnblogs.com/guducp/p/9026682.html

时间: 2024-08-30 08:15:32

一个简单的进程池版的爬虫程序的相关文章

一个简单的线程池程序设计(消费者和生产者)

最近在学习linux下的编程,刚开始接触感觉有点复杂,今天把线程里比较重要的线程池程序重新理解梳理一下. 实现功能:创建一个线程池,该线程池包含若干个线程,以及一个任务队列,当有新的任务出现时,如果任务队列不满,则把该任务加入到任务队列中去,并且向线程发送一个信号,调用某个线程为任务队列中的任务服务.如果线程池中的线程都在忙,那么任务队列中的任务则等待.本程序较为简单,把任务定义为了两个数相加,输出它们的和. 采用自顶向下的设计方法,先把整体框架构建出来,然后再慢慢把细节,小模块补全. 1.在l

Linux C 一个简单的线程池程序设计

实现功能:创建一个线程池,该线程池包含若干个线程,以及一个任务队列,当有新的任务出现时,如果任务队列不满,则把该任务加入到任务队列中去,并且向线程发送一个信号,调用某个线程为任务队列中的任务服务.如果线程池中的线程都在忙,那么任务队列中的任务则等待.本程序较为简单,把任务定义为了两个数相加,输出它们的和. 采用自顶向下的设计方法,先把整体框架构建出来,然后再慢慢把细节,小模块补全. 1.在linux环境下构建三个文件夹(include,src,bin) include:包含该程序所需要的头文件.

.Net——做一个简单代理IP池

一.缘由. 抓取数据时,有一些网站 设置了一些反爬虫设置,进而将自己本地 IP 地址拉入系统黑名单.从而达到禁止本地 IP 访问数据的请求. 二.思路. 根据其他 代理 IP 网站,进行一个免费的代理 IP 进行搜集,然后进行统一 验证 管理 如下图: 三.抓取包含代理 IP 的网站页面. 抓取来网站代码之后,利用 HtmlAgilityPack 进行 html 的解析.并将代理 IP 验证,存放队列等操作. 四.直接看效果图. 运行效果. 浏览器 请求 :http://127.0.0.1:12

进程丶数据共享丶锁丶进程池丶模块(爬虫)

一丶进程 1.什么是进程 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器.程序时指令丶数据及其组织形式的描述,进程是程序的实体. 狭义定义:进程是正在运行的程序的实例. 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动 .它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,

Linux下一个简单守护进程的实现 (Daemon)

在Linux/UNIX系统引导的时候会开启很多服务,这些服务称为守护进程(也叫Daemon进程).守护进程是脱离于控制终端并且在后台周期性地执行某种任务或等待处理某些事件的进程,脱离终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的中断信息所终止. 创建守护进程的一般步骤: (1) 创建子进程,退出父进程 为了脱离控制终端需要退出父进程,之后的工作都由子进程完成.在Linux中父进程先于子进程退出会造成子进程成为孤儿进程,而每当系统发现一个孤儿进程时,就会自动由

Linux C 实现一个简单的线程池

线程池的定义 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中.如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙.如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值.超过最大值的线程可以排队,但他们要等到其他线程完成后才启动. 什么时

一个简单的客户单与服务端程序

实验环境是linux系统,效果如下: 1.启动服务端程序,监听在6666端口上  2.启动客户端,与服务端建立TCP连接  3.建立完TCP连接,在客户端上向服务端发送消息 4.断开连接 实现的功能很简单,但是对于初来乍到的我费了不少劲,因此在此总结一下,如有错点请各位大神指点指点 什么是SOCKET(插口): 这里不用 "套接字" 而是用 "插口" 是因为在<TCP/IP协议卷二>中,翻译时也是用 "插口" 来表示socket的.

一个简单的线程池实现

前段时间学习了线程方面的知识,看了关于线程池的教程,自己也试着实现一个.跟大家分享,同时也整理整理思路.   对线程池的要求: 1.用于处理大量短暂的任务. 2.动态增加线程,直到达到最大允许的线程数量. 3.动态销毁线程.   线程池的实现类似于"消费者--生产者"模型: 用一个队列存放任务(仓库,缓存) 主线程添加任务(生产者生产任务) 新建线程函数执行任务(消费者执行任务) 由于任务队列是全部线程共享的,就涉及到同步问题.这里采用条件变量和互斥锁来实现. ------------

自己实现的一个简单的数据库连接池

自己突然就找到了以前学习的感觉,要不是完了这几个月英爱能找一份比现在好点的工作,说实话还是有点后悔,但是没关系,从现在开始加油还来得及. 今天首先学的是数据库连接,就想到了实现一个数据库连接池,虽然很Lower 但是还是记录下来,一步一个脚印. 首先实现方法是创建一个连接池对象,里面放一个List对象用来保存数据库连接,自己写一个类,实现Connection对象,在里面的close方法里面将连接还给连接池. 然后在从数据库连接池中获取数据的时候用removeFirst方法,移除并返回第一个对象,