零基础爬取堆糖网图片(二)---多线程版
零基础爬取堆糖网图片(二)—多线程版
全文介绍:
接着上篇文章,我们已经实现图片的下载,但是我们发现整个爬取过程中,因为使用了for循环嵌套,导致每次遍历,都会打开文件在关闭,打开文件在关闭(套娃)。所以需要注意for循环的使用,其次下载图片是整个程序中最耗时的,如果需要提升爬取速度,那么我们可以从这个方向入手,实现多线程爬取
涉及内容:
- 爬虫基本流程
- requests库基本使用
- urllib.parse模块
- threading模块
图例说明:
- 请求与响应
sequenceDiagram
浏览器->>服务器: 请求
服务器–>>浏览器: 响应
浏览器->>服务器: 请求
服务器–>>浏览器: 响应
- 爬虫基本流程
graph TD
A[目标网站] –>|分析网站| B(url)
B –> C[模拟浏览器请求资源]
C –>D[解析网页]
D–>E[保存数据]
A[目标网站] –>|分析网站| B(url)
B –> C[模拟浏览器请求资源]
C –>D[解析网页]
D–>E[保存数据]
正文:
1.导入
import urllib.parse
import threading
import requests
2.发送请求,获取响应
def get_page(url):
page = requests.get(url)
page = page.content
# 将 bytes 转化为 字符串
page = page.decode(\'utf-8\')
return page
3.关键字以及翻页
def pages_from_duitang(label):
url = \'https://www.duitang.com/napi/blog/list/by_search/?kw={}&start={}\'
pages = []
# 将中文转化成url编码
label = urllib.parse.quote(label)
# 0-3600 步长100
for index in range(0, 3600, 100):
# 将这两个变量替换占位符{}
u = url.format(label, index)
print(u)
page = get_page(u)
pages.append(page)
return pages
4.获取一个页面上的所有图片子链接
def findall_pages(page, startpart, endpart):
all_string = []
end = 0
# -1代表找不到 意思就是匹配到就执行循环
while page.find(startpart, end) != -1:
# 匹配第一个字符,从下标0开始匹配到的位置下标,并将字符长短传给start变量
start = page.find(startpart, end) + len(startpart)
# 将从第一个需要匹配的字符串后面的字符开始,匹配第二个需要匹配的字符出现的位置,并将这个下标值赋给end变量
end = page.find(endpart, start)
# 切片 取两个所要匹配字符 之间的部分也就是图片url
string = page[start:end]
# 存入列表
all_string.append(string)
return all_string
5.爬取全部页面
def pic_url_from_pages(pages):
pic_url = []
for page in pages:
url = findall_pages(page, \'path":"\', \'"\')
pic_url.extend(url) # 合并列表
return pic_url
6.下载图片
def pic_download(url, n):
r = requests.get(url)
path = r"C:\Users\Mark\Desktop\新建文件夹 (2)\%s.jpg" %n
with open(path, \'wb\')as d:
d.write(r.content)
7.调用函数
之前的函数就像是一个一个的零件,现在我们要拼装这些零件,这个车才开的起来!
版权声明:本文为mark-wq原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。