python爬虫简单爬取
最近学习了爬虫,朋友说想看看关于cos的美图,好巧不巧找到了一个好的网站,废话不多说,下面就帮朋友拿图片。
基于基础爬虫
目标网站http://www.cosplay8.com/pic/chinacos/
首先要知道爬虫的步骤
1.请求
2.解析
3.保存
- 基本思路
首先请求
import requests
import re
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 '
'Safari/537.36 Edg/110.0.1587.41 '
}
def html_all_page(url):
html = requests.get(url, headers=header)
html.encoding = 'utf-8'
data = re.findall('<li><a href="(.*?)">', html.text) # 找出网页所有链接
for i in range(1, 2): # 网页翻页
url = f'http://www.cosplay8.com/pic/chinacos/list_22_{i}.html'
html_all_page(url)
这里注意网页的第一页链接为http://www.cosplay8.com/pic/chinacos/
第二页链接为 http://www.cosplay8.com/pic/chinacos/list_22_2.html
但 http://www.cosplay8.com/pic/chinacos/list_22_1.html 这样写也可以到第一页,而有些网站不行
进入网页F12发现,每个链接只有后缀,所以我们要加上前缀
import os
for url in data:
url_data = 'http://www.cosplay8.com' + url # 合并链接
url2 = requests.get(url_data, headers=header) # 合并后的链接,再次请求每个链接
url2.encoding = 'utf-8'
# print(url2.text)
url_page = re.findall('var totalpage = (.*?);', url2.text) # 获得图片的页数
img_name = re.findall('<title>(.*?)-Cosplay中国</title>', url2.text) # 获得图片的名字
for img_name in img_name: # 创建图片对应的文件夹
if not os.path.exists('cosplay8\\' + img_name):
os.mkdir('cosplay8\\' + img_name)
print(img_name)
# 这里和的后缀和上面的不一样,第一页不是为1
for i in range(int(url_page[0])): # 生成图片每一页链接
page = url_data.split('.html')[0] + f'_{i + 1}.html'.replace('_1.', '.')
print(page)
img_save(img_name, page)
结果如下,24页对上了
刚好24页
- 然后就可以解析图片保存了
def img_save(img_name, page):
img_get_all = requests.get(page, headers=header) # 请求每一个图片链接
img_get_all.encoding = 'utf-8'
img = re.findall('把href里的(.*?)链接改为', img_get_all.text) # 获得图片
for img in img:
img = 'http://www.cosplay8.com' + img # 合并图片链接
img_data_name = img.split('/')[-1] # 保存图片的后缀名
img_data = requests.get(img).content # 获得图片数据
with open('cosplay8\\' + img_name + '/' + img_data_name, 'wb')as f: # 保存
f.write(img_data)
print(img, '完成')
f.close()
-
最后结果
-
总结
1.爬虫的思路要从小到大,从少到多。
2.解析数据没有数据时到请求到的数据里解析,而不是网页上的数据
3.保存数据图片用的后缀名不能一样,不然会一直覆盖保存
仅供学习参考
如有不足,请多指教
完整代码
import requests
import re
import os
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 '
'Safari/537.36 Edg/110.0.1587.41 '
}
def html_all_page(url):
html = requests.get(url, headers=header)
html.encoding = 'utf-8'
data = re.findall('<li><a href="(.*?)">', html.text) # 找出网页所有链接
for url in data:
url_data = 'http://www.cosplay8.com' + url # 合并链接
url2 = requests.get(url_data, headers=header) # 合并后的链接,再次请求每个链接
url2.encoding = 'utf-8'
# print(url2.text)
url_page = re.findall('var totalpage = (.*?);', url2.text) # 获得图片的页数
img_name = re.findall('<title>(.*?)-Cosplay中国</title>', url2.text) # 获得图片的名字
for img_name in img_name:
if not os.path.exists('cosplay8\\' + img_name):
os.mkdir('cosplay8\\' + img_name)
print(img_name)
for i in range(int(url_page[0])):
page = url_data.split('.html')[0] + f'_{i + 1}.html'.replace('_1.', '.')
print(page)
img_save(img_name, page)
def img_save(img_name, page):
img_get_all = requests.get(page, headers=header) # 请求每一个图片链接
img_get_all.encoding = 'utf-8'
img = re.findall('把href里的(.*?)链接改为', img_get_all.text) # 获得图片
for img in img:
img = 'http://www.cosplay8.com' + img # 合并图片链接
img_data_name = img.split('/')[-1] # 保存图片的后缀名
img_data = requests.get(img).content # 获得图片数据
with open('cosplay8\\' + img_name + '/' + img_data_name, 'wb')as f: # 保存
f.write(img_data)
print(img, '完成')
f.close()
# 'http://www.cosplay8.com//uploads/allimg/230106/112879-230106114420-50.jpg'
for i in range(1, 2):
url = f'http://www.cosplay8.com/pic/chinacos/list_22_{i}.html'
html_all_page(url)