php多线程抓取网页(线程池多线程获取图片数据参考源码附完整源码参考学习)

优采云 发布时间: 2022-02-13 03:02

  php多线程抓取网页(线程池多线程获取图片数据参考源码附完整源码参考学习)

  图片站的lemanoosh数据是异步加载的形式。下拉会显示更多的数据,也就是下一页的数据。通过谷歌浏览器可以清楚的看到数据接口地址和数据呈现形式,与其他网站返回json数据的区别在于网站返回部分html源数据,包括需要获取的图片地址。

  使用的第三方库:

  import requests

from fake_useragent import UserAgent

import re

from multiprocessing.dummy import Pool as ThreadPool

import datetime

import time

  其中multiprocessing.dummy用于执行多线程任务,线程池用于执行多线程任务。

  延期:

  工作中有一个常见的场景。比如我们现在需要下载10W张图片。我们不可能写一个for循环一个一个下载,或者我们必须使用多个进程进行简单的HTTP压力测试。或者线程去做(每个请求handler,都会有一个参数(所有参数生成一个队列))然后把handler和queue映射到Pool中。一定要使用多线程或者多进程,然后把100W队列扔到线程池或者进程池去处理python中的multiprocessingPool进程池,multiprocessing.dummy很好用,一般:

  from multiprocessing import Pool as ProcessPool from multiprocessing.dummy import Pool as ThreadPool

  前者是多进程,后者使用线程,之所以dummy(中文意为“假”)———————————————

  来源:本文为CSDN博主“FishBear_move_on” 原文链接:

  爬行的想法

  接口地址:

  请求方式:POST

  请求数据:

  block_last_random: minijobboard

  块自定义:53

  行动:list_publications

  第2页

  注:page字段为页码,可通过更改页码获取数据内容。

  参考来源:

  #获取图片数据

def get_pagelist(pagenum):

url="https://lemanoosh.com/app/themes/lemanoosh2017/resources/publications.php"

headers={'User-Agent':UserAgent().random}

data={

'block_last_random': 'custom',

'block_custom': '54',

'action': 'list_publications',

'page': pagenum,

}

response=requests.post(url=url,data=data,headers=headers,timeout=8)

#print(response.status_code)

if response.status_code == 200:

html=response.content.decode('utf-8')

datamedias=re.findall(r'data-media="(.+?)"',html,re.S)

print(len(datamedias))

print(datamedias)

datamedias=set(datamedias)

print(len(datamedias))

return datamedias

  使用正则表达式获取图像数据,即图像地址。同时经过对比发现源html数据中的图片地址有重复,所以进行去重,使用set函数!

  #下载图片数据

def dowm(imgurl):

imgname=imgurl.split("/")[-1]

imgname=f'{get_time_stamp13()}{imgname}'

headers = {'User-Agent': UserAgent().random}

r=requests.get(url=imgurl,headers=headers,timeout=8)

with open(f'lemanoosh/{imgname}','wb') as f:

f.write(r.content)

print(f'{imgname} 图片下载成功了!')

  使用线程池多线程获取图像数据参考源码:

  #多线程下载图片数据

def thread_down(imgs):

try:

# 开4个 worker,没有参数时默认是 cpu 的核心数

pool = ThreadPool()

results = pool.map(dowm, imgs)

pool.close()

pool.join()

print("采集所有图片完成!")

except:

print("Error: unable to start thread")

  #主程序

def main():

for i in range(1,2000):

print(f'正在爬取采集第 {i} 页图片数据..')

imgs=get_pagelist(i)

thread_down(imgs)

  附上完整的源代码参考:

  #20210429 获取图片数据

#微信:huguo00289

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

import requests

from fake_useragent import UserAgent

import re

from multiprocessing.dummy import Pool as ThreadPool

import datetime

import time

def get_float_time_stamp():

datetime_now = datetime.datetime.now()

return datetime_now.timestamp()

def get_time_stamp16():

# 生成16时间戳 eg:1540281250399895 -ln

datetime_now = datetime.datetime.now()

print(datetime_now)

# 10位,时间点相当于从UNIX TIME的纪元时间开始的当年时间编号

date_stamp = str(int(time.mktime(datetime_now.timetuple())))

# 6位,微秒

data_microsecond = str("d"%datetime_now.microsecond)

date_stamp = date_stamp+data_microsecond

return int(date_stamp)

def get_time_stamp13():

# 生成13时间戳 eg:1540281250399895

datetime_now = datetime.datetime.now()

# 10位,时间点相当于从UNIX TIME的纪元时间开始的当年时间编号

date_stamp = str(int(time.mktime(datetime_now.timetuple())))

# 3位,微秒

data_microsecond = str("d"%datetime_now.microsecond)[0:3]

date_stamp = date_stamp+data_microsecond

return int(date_stamp)

#获取图片数据

def get_pagelist(pagenum):

url="https://lemanoosh.com/app/themes/lemanoosh2017/resources/publications.php"

headers={'User-Agent':UserAgent().random}

data={

'block_last_random': 'custom',

'block_custom': '54',

'action': 'list_publications',

'page': pagenum,

}

response=requests.post(url=url,data=data,headers=headers,timeout=8)

#print(response.status_code)

if response.status_code == 200:

html=response.content.decode('utf-8')

datamedias=re.findall(r'data-media="(.+?)"',html,re.S)

print(len(datamedias))

print(datamedias)

datamedias=set(datamedias)

print(len(datamedias))

return datamedias

#下载图片数据

def dowm(imgurl):

imgname=imgurl.split("/")[-1]

imgname=f'{get_time_stamp13()}{imgname}'

headers = {'User-Agent': UserAgent().random}

r=requests.get(url=imgurl,headers=headers,timeout=8)

with open(f'lemanoosh/{imgname}','wb') as f:

f.write(r.content)

print(f'{imgname} 图片下载成功了!')

#多线程下载图片数据

def thread_down(imgs):

try:

# 开4个 worker,没有参数时默认是 cpu 的核心数

pool = ThreadPool()

results = pool.map(dowm, imgs)

pool.close()

pool.join()

print("采集所有图片完成!")

except:

print("Error: unable to start thread")

#主程序

def main():

for i in range(1,2000):

print(f'正在爬取采集第 {i} 页图片数据..')

imgs=get_pagelist(i)

thread_down(imgs)

if __name__=='__main__':

main()

  以上内容仅供参考和学习。这个网站适合新手练习。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线