这是萌新的第一个爬虫,也是萌新发布的第一篇文章。 首先声明一下本萌新在过去一个月内短程突击学习了Python网络爬虫,在此提前一并对倾囊相授,传道授业解惑的各位大神大佬们表示真挚的感谢和崇高的敬意!!! 萌新的第一个爬虫准备对某小众模型网站进行试验: 静态模型爱好者网站链接:http://www.moxingfans.com,又有谁能想到咱也是个胶佬呢? 点击作品,本次要爬取的是网站作品栏目下的作品名录:
1.导入模块
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_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=\"(.*?)\" /></a></div>",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_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=\"(.*?)\" /></a></div>",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"
|