目标网站:https://www.1ppt.com/moban/
需求:
1、用多线程爬取前10页模板名字和模板详情页链接
2、把模板名字和模板详情页链接保存到模板.csv文件里面
import requests
from lxml import etree
import time
from urllib.parse import urljoin
from queue import Queue
import threading
import csv
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'}
class Product(threading.Thread): # 生产者
# 在自定义类中写了init方法 调用父类Thread的init方法
def __init__(self, page_url, img_url):
super().__init__()
# 初始化方法 将url拿到
self.page_url = page_url
self.img_url = img_url
pass
def run(self):
# 让生产者拿到url去处理
# 三个生产者 怎么去处理10个url?让生产者一直工作 直到队列为空(队列里的url处理完了)
while True:
# 如果队列为空 结束循环
if self.page_url.empty():
break
else:
# 如果队列不为空 拿到url去获取数据
url = self.page_url.get()
# 对url发生请求 进行解析 单独写一个解析数据的方法
self.parse_data(url)
# 解析数据
def parse_data(self, url):
resposne = requests.get(url, headers=headers)
resposne.encoding = 'gb2312'
data = resposne.text
time.sleep(2)
# 创建对象
html = etree.HTML(data)
a_tag = html.xpath('//ul[@class="tplist"]/li/h2/a')
# print('检查', len(img_tag))
for a in a_tag:
href = urljoin('https://www.1ppt.com/moban/ppt_moban_1.html', a.xpath('./@href')[0].strip())
name = a.xpath('./text()')[0].strip()
# print('href:{} name:{}'.format(href, name))
self.img_url.put((href, name))
class Customer(threading.Thread):
def __init__(self, img_url):
super().__init__()
self.img_url = img_url
def run(self):
while True:
if self.img_url.empty():
break
else:
img_data = self.img_url.get()
url, name = img_data
if __name__ == '__main__':
page_url = Queue()
for i in range(1, 11):
url = f'https://www.1ppt.com/moban/ppt_moban_{i}.html'
page_url.put(url)
img_url = Queue()
t_lst = []
for i in range(10):
t = Product(page_url, img_url)
t.start()
t_lst.append(t)
for i in t_lst:
i.join()
for i in range(10):
t1 = Customer(img_url)
t1.start()
你这都没有写保存为.csv的代码,我不明白只是要保存链接和模板名称,为什么要写成这么花里胡哨的?获取到链接和名称那里就可以写到csv里面了
for a in a_tag:
href = urljoin('https://www.1ppt.com/moban/ppt_moban_1.html', a.xpath('./@href')[0].strip())
name = a.xpath('./text()')[0].strip()
with open(file='模板.csv', mode='a+', encoding='utf8', newline='\n') as csvFile:
csvWriter = csv.writer(csvFile)
csvWriter.writerow([href, name])
print('href:{} name:{}'.format(href, name))
self.img_url.put((href, name))