python和c 情侣网名_Python3 爬取网站收藏数超过70的 < 情侣网名 >

[Python] 纯文本查看 复制代码# coding=utf-8

# python 3.7

import urllib.request,urllib.error

import re

import threading

import multiprocessing

from time import sleep

# 保存网页内容

def dataFilter():

# 设置了全局参数(方便),最好还是传参数

global htmlQueue # 任务队列

global some # log文件

global lock # 文件锁

while True:

html = htmlQueue.get() # 从任务队列中获取任务(数据)

if html is None: exit(0) #退出线程

# 正则表达式获取数据

favorites = re.compile(r'title="收藏">(\d+)').findall(html)

centent = re.compile(r'id="txt-\d+-\d+">(.*?)

').findall(html)

# 收藏值大于 70 的保存

tmp = []

lock.acquire() # 当文件没有其他线程写入时写入文件

for n in range(len(favorites)):

if int(favorites[n]) > 70:

tmp.append(favorites[n])

index = n*2

tmp.append(centent[index])

tmp.append(centent[index+1])

some.write(','.join(tmp) + '\n')

some.flush()

tmp.clear()

lock.release() # 写入文件完成,报告(默认为 1 )

# 获取一页网页数据

def GetHtml(url):

# 浏览器头部信息

head = {

'Accept-Language': 'zh-CN,zh;q=0.9',

"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.30 Safari/537.36"

}

req = urllib.request.Request(url=url, headers=head)

# 这里可以加入 try 代码,处理打开网页失败情况

response = urllib.request.urlopen(req)

return response.read().decode('utf-8')

# 爬取网站IP

url = 'https://www.woyaogexing.com/name/ql/'

# 第一页

print(f'正在爬取第一页 {url}')

parent = GetHtml(url)

# 获取当前页面包含的所有下一页的IP

page = re.compile(r'/name/ql/(index_\d+.html)').findall(parent)

page = set(page) # 集合去重

page = list(page) # 转换回列表

page.sort() # 排序

# 第一页包含的所有页面IP

print(page)

# log保存文件

some = open('some.txt', 'w', encoding='utf-8')

some.write('收藏数, 签名1, 签名2\n')

# 写入文件锁,只能单个写入,避免数据混淆

# 默认值为 1 (单个线程写入文件)

lock = threading.Semaphore()

# 线程任务队列

htmlQueue = multiprocessing.Queue()

# 管理所有线程的容器

threadList = []

# 开启4个线程

# 设置为守护线程,主线程退出后结束所有子线程,避免线程悬挂

maxThreadN = 4

for n in range(maxThreadN):

tmp = threading.Thread(target=dataFilter, daemon=True)

threadList.append(tmp)

tmp.start()

# 向线程任务队列提交任务

for n in page:

print(f'正在爬取 {n}')

sleep(2) # 加上等待时间2秒,我们要对网站温柔一些

htmlQueue.put(GetHtml(url + n))

# 任务完成,提交数据 None 结束所有线程

for n in range(maxThreadN):

htmlQueue.put(None)

# 等待所有线程结束

for th in threadList:

th.join()

# 最后关闭 log 文件

some.close()

input('所有任务完成!')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值