受害者:热门表情_发表情,表情包大全fabiaoqing.com
这里我们先分析一下url
看得出来,翻一页,url的page后面也会跟着遍相对于页面的页数。
现在再来分析一下内容
可以看到内容在img下的src里面,而且每一张的图片都在那一位置,每一个div标签没有什么改边的,
用xpath提取的语法为
//div[@class="ui segment imghover"]/div//img/@src
那么这个就好爬了
导入模块
import time,requests,parsel
from threading import Thread,Lock
from queue import Queue
from fake_useragent import UserAgent
网址、队列、锁
def __init__(self):
self.url = 'https://fabiaoqing.com/biaoqing/lists/page/{}.html'
# 创建2个队列
self.q = Queue()
# 创建1把锁
self.lock = Lock()
def url_in(self):
"""url地址入队列"""
for page in range(200):
url = self.url.format(page) # 循环0~200
# 入队列
self.q.put(url)
入列
def url_in(self):
"""url地址入队列"""
for page in range(200):
url = self.url.format(page) # 0~200
# 入队列
self.q.put(url)
数据解析
def parse_html(self):
"""线程事件函数:获取url,请求,解析,处理数据"""
while True:
if not self.q.empty(): # 如果队列不为空 判断他是否为空,如果不为空再get
url = self.q.get()
headers = {'User-Agent': UserAgent().random}
html = requests.get(url=url, headers=headers) # 如果爬动态加载的话就在 ) 后面点上一个json的,下面的解析函数就要用f12里面找到的xhr->preview里面的data数据
"""解析函数"""
selector = parsel.Selector(html)
img_url = selector.xpath('//div[@class="ui segment imghover"]/div//img/@src')
print(img_url)
else:
break # 结束 如果是空的,那这个线程就结束了
创建线程
def run(self):
# 先让url地址入队列
self.url_in()
# 创建多线程运行
t_list = []
for i in range(2): # 创建2个线程
t = Thread(target=self.parse_html)
t_list.append(t)
t.start()
for t in t_list:
t.join() # 结束
运行
if __name__ == ' __main__':
start_time = time.time()
spider = DoutuSpider()
spider.run()
end_time = time.time()
print('time:%.2f' % (end_time - start_time)) # 看运行的时间
完整代码
import time,requests,parsel
from threading import Thread,Lock
from queue import Queue
from fake_useragent import UserAgent
class DoutuSpider:
def __init__(self):
self.url = 'https://fabiaoqing.com/biaoqing/lists/page/{}.html'
# 创建2个队列
self.q = Queue()
# 创建1把锁
self.lock = Lock()
def url_in(self):
"""url地址入队列"""
for page in range(200):
url = self.url.format(page) # 0~200
# 入队列
self.q.put(url)
def parse_html(self):
"""线程事件函数:获取url,请求,解析,处理数据"""
while True:
# 上锁
self.lock.acquire()
if not self.q.empty(): # 如果队列不为空 判断他是否为空,如果不为空再get
url = self.q.get()
# 放锁
self.lock.release()
headers = {'User-Agent': UserAgent().random}
html = requests.get(url=url, headers=headers) # 如果爬动态加载的话就在 ) 后面点上一个json的,下面的解析函数就要用f12里面找到的xhr->preview里面的data数据
"""解析函数"""
selector = parsel.Selector(html)
img_url = selector.xpath('//div[@class="ui segment imghover"]/div//img/@src')
print(img_url)
else:
self.lock.release()
break # 结束 如果是空的,那这个线程就结束了
def run(self):
# 先让url地址入队列
self.url_in()
# 创建多线程运行
t_list = []
for i in range(2): # 创建2个线程
t = Thread(target=self.parse_html)
t_list.append(t)
t.start()
for t in t_list:
t.join() # 结束
if __name__ == ' __main__':
start_time = time.time()
spider = DoutuSpider()
spider.run()
end_time = time.time()
print('time:%.2f' % (end_time - start_time)) # 看运行的时间