这是萌新的第一个爬虫,也是萌新发布的第一篇文章。
首先声明一下本萌新在过去一个月内短程突击学习了Python网络爬虫,在此提前一并对倾囊相授,传道授业解惑的各位大神大佬们表示真挚的感谢和崇高的敬意!!!
萌新的第一个爬虫准备对某小众模型网站进行试验:
静态模型爱好者网站链接:http://www.moxingfans.com,又有谁能想到咱也是个胶佬呢?
点击作品,本次要爬取的是网站作品栏目下的作品名录:
#使用正则表达式爬取静态模型爱好者作品 import json import re import requests
需要强调本人爬虫书写习惯为设置class类,此后系列如无必要将不再提醒
class Moxingfans_works:2.初始化函数
在数据包中找到网址和用户代理:
注意到后翻到第2页时请求url发生了相应的变化,由此推理页数位于请求url对应位置
网址为http://www.moxingfans.com/works/list_21_{}.html,其中大括号内容为页数
由此得出初始化函数:
def __init__(self):
self.start_url="http://www.moxingfans.com/works/list_21_{}.html"
self.headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"}
3.构造url列表
假设有100页
def get_url_list(self):#构造url列表
url_list=[]
for i in range(1,100):
url_list.append(self.start_url.format(i))
return url_list
4.发送请求,获取响应
经过初步侦察发现作品栏目共有93页,于是设置判断条件:当为空则不返回requests
def parse_url(self,url):#发送请求,获取响应
response=requests.get(url,headers=self.headers)
if response:
return response.content.decode()
else:
return ""
5.提取数据
显而易见作品名称都在元素中的title属性中
不妨使用正则表达式:
def get_content_list(self,html_str):#提取数据
content_list=re.findall(r"alt="(.*?)" />",html_str,re.S)
return content_list
6.保存
def save_content(self,content_list,page_num):#保存
with open("作品.txt","a",encoding="utf-8")as f:
for content in content_list:
f.write(json.dumps(content,ensure_ascii=False))
f.write("n")
print("Page"+str(page_num)+"保存成功")
7.主要逻辑
需要在其中设置页码数,每爬取一页页码数加一
def run(self):#实现主要逻辑
url_list=self.get_url_list()
for url in url_list:#遍历,发送请求,获取响应
html_str=self.parse_url(url)
content_list=self.get_content_list(html_str)#提取数据
page_num=url_list.index(url)+1#页码数
self.save_content(content_list,page_num)#保存
8.主函数
if __name__=="__main__":
moxingfans_works=Moxingfans_works()
moxingfans_works.run()
9.大功告成
爬虫完整内容如下:
#使用正则表达式爬取静态模型爱好者作品
import json
import re
import requests
class Moxingfans_works:
def __init__(self):
self.start_url="http://www.moxingfans.com/works/list_21_{}.html"
self.headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"}
def get_url_list(self):#构造url列表
url_list=[]
for i in range(1,100):
url_list.append(self.start_url.format(i))
return url_list
def parse_url(self,url):#发送请求,获取响应
response=requests.get(url,headers=self.headers)
if response:
return response.content.decode()
else:
return ""
def get_content_list(self,html_str):#提取数据
content_list=re.findall(r"alt="(.*?)" />",html_str,re.S)
return content_list
def save_content(self,content_list,page_num):#保存
with open("作品.txt","a",encoding="utf-8")as f:
for content in content_list:
f.write(json.dumps(content,ensure_ascii=False))
f.write("n")
print("Page"+str(page_num)+"保存成功")
def run(self):#实现主要逻辑
url_list=self.get_url_list()
for url in url_list:#遍历,发送请求,获取响应
html_str=self.parse_url(url)
content_list=self.get_content_list(html_str)#提取数据
page_num=url_list.index(url)+1#页码数
self.save_content(content_list,page_num)#保存
if __name__=="__main__":
moxingfans_works=Moxingfans_works()
moxingfans_works.run()
爬取后内容部分展示:
"1/700 密苏里号战列舰1944 " "1/35 肖特卡尔1973年" "流浪地球CN171号运兵车载具" "豹2A6 前期型,演习模式" "1/700 俾斯麦号战列舰 波罗地海涂装" "不列颠空战——田宫1/48喷火MK.I VS BF109 E-4" "挑战者2型主战坦克2003伊拉克战争" "1/35 BF109 G-6哈特曼座机" "1/350 BB-63 密苏里号战列舰" "1/35 amx1390" "苏联飞毛腿-B导弹发射车" "梅卡瓦3D"



