因为近期在自学python,想着先通过一些项目提升对这个编程语言的兴趣,而且爬虫也是python中对基本功要求较低的项目,就根据所学内容编写了一个爬虫项目爬取某网站的图片。温馨提示:爬虫学得好,牢饭吃到饱,学习爬虫第一课应该去了解一下相应的法律法规,避免出现一些小差错。
新建项目
本人使用的是pycharm社区版,具体下载安装等一系列方法随便搜一下就有很多,这里就不再赘述。创建本项目的虚拟环境(这个是有必要的,防止多个项目之间产生重叠进而产生一系列搞不懂的问题)。点击file->new project,出现下面界面。
这里可以修改你所创建的项目的存放地址(通过点击后面文件夹的标识修改),蓝色的部分就是你所创建的项目的名字,这里我改成fetch_image,注意项目名不要出现中文,下方的内容是项目的解释器,默认不管。点击create
新建python文件
项目创建后,右键点击左上方你所创建的文件,弹出的选择框中选择new->python file,创建本脚本文件的名字,我设置的是1.py(注意这里文件的后缀名一定要是.py)。
可以看到在project下面多了一个刚才创建的1.py文件,接下来你就可以在右侧书写你的python代码啦。
导入本项目相关的依赖包
import requests
#from lxml import etree
from bs4 import BeautifulSoup
import time
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
本项目是利用beautifulsoup包实现图片连接的定位,具体的使用方法这里也不细讲。request是爬虫基本都需要的一个依赖包,可以通过它来得到链接的scripts内容,由于要下载的图片较多,所以采用多线程和线程池来最大化的利用cpu资源。
相应准备工作
本次要爬取的是彼岸图网的图片,先放一张页面压压惊。
选择用Microsoft edge浏览器输入网址打开,在本网站页面的空白处鼠标右键点击检查。
出现上示页面后点击网络,然后将页面刷新,点击出现的4kmeinv/,在标头里面可以看出请求方法是get,URL,cookie,和ueragent。将源相应的内容换成你自己按照此方法得出的即可。
代码如下:
headers ={
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44",
"referer": "https://pic.netbian.com/4kmeinv/index.html",
"cookie": "__yjs_duid=1_c427763b6a77b795723fe580805d86f41635746735356; Hm_lvt_14b14198b6e26157b7eba06b390ab763=1635749214,1636550738,1636550843; zkhanecookieclassrecord=%2C54%2C; Hm_lvt_526caf4e20c21f06a4e9209712d6a20e=1635746736,1636550853,1636557267,1636606416; Hm_lpvt_526caf4e20c21f06a4e9209712d6a20e=1636606416; yjs_js_security_passport=d0fe81024fb5a59de630df3fb7dd52134fe3a84c_1636606550_js"
}
得到网页上图片的原图
如果有过一些爬虫基础的小伙伴肯定知道,在网页上右键选择检查页面源代码可以得到网页上相应图片的URL,不过一定要注意,这些URL对应的都是缩略图,分辨率和大小一言难尽,为了更好的欣赏,肯定是希望爬取得到的是原图对吧。所以此时随便选择一张图片点击进入下一个页面,再右键选择检查页面源代码,可以得到如下HTML页面。
往下翻,找到后缀名是.jpg的链接,一个个点进去试试,最后一定可以找到本子网页上所示的原图,而且可以看出,在JavaScript里面的URL放在a标签下面的image标签内的src内容。此时点击就可以得到原图。不过一定要注意,这个src如果直接粘贴放到网页上的话是会出现404的,因为我们少了一个很重要的内容也就是前面网络内的referer,只有将两个链接拼接到一起时才会出现内容。这个在代码中会有体现的。
有小伙伴可能就会问了,既然这样就可以得到原图,何必大费周章,不过你要理解爬虫爬出来的可是许多图片喔。而且还是很多子页面里面的图片,这么简单高效,还不尝试一下。
最后附上源码,直接粘贴即可使用
import requests
#from lxml import etree
from bs4 import BeautifulSoup
import time
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
def dl_page(url):
res = requests.get(url,headers = headers,proxies = proxies)
res.encoding = "gbk"
#html = etree.HTML(res.text) #
#table = html.xpath("//*[@id="main"]/div[3]/ul/li[1]")[0]
#trs = table.xpath("./tr[position()>1]")
main_page = BeautifulSoup(res.text,"html.parser")
main_url = main_page.find("ul",attrs={"class":"clearfix"})
alist = main_url.find_all("a")
#print(len(alist))
#print(alist)
url_ = "https://pic.netbian.com"
for a in alist:
href = a.get("href")
url_real = url_+href
resp = requests.get(url_real, headers=headers,proxies = proxies)
resp.encoding = "gbk"
child_page = BeautifulSoup(resp.text, "html.parser")
img_page = child_page.find("a", attrs={"id": "img"})
img = img_page.find("img")
src = img.get("src")
src_real = url_+src
img_res = requests.get(src_real)
img_name = src.split("/")[-1] # 拿到最后一个杠后面的内容
with open("img/" + img_name, mode="wb") as f:
f.write(img_res.content) # 括号内内容为字节,不能打印
print("over", img_name)
time.sleep(10)
print ("提取完毕")
#
if __name__ == '__main__':
headers ={
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44",
"referer": "https://pic.netbian.com/4kmeinv/index.html",
"cookie": "__yjs_duid=1_c427763b6a77b795723fe580805d86f41635746735356; Hm_lvt_14b14198b6e26157b7eba06b390ab763=1635749214,1636550738,1636550843; zkhanecookieclassrecord=%2C54%2C; Hm_lvt_526caf4e20c21f06a4e9209712d6a20e=1635746736,1636550853,1636557267,1636606416; Hm_lpvt_526caf4e20c21f06a4e9209712d6a20e=1636606416; yjs_js_security_passport=d0fe81024fb5a59de630df3fb7dd52134fe3a84c_1636606550_js"
}
proxies = {
"http": "http://113.125.156.47:8888"
}
url = "https://pic.netbian.com/4kmeinv/index.html"
dl_page(url)
# # for i in range(2,148):#此效率会极其低下
# # dl_page(f"https://pic.netbian.com/4kmeinv/index_{i}.html")
with ThreadPoolExecutor(10) as t:
for i in range(2,30):
t.submit(dl_page,f"https://pic.netbian.com/4kmeinv/index_{i}.html")
print("全部下载完毕!!!")
关于代码的相关内容
1:有小伙伴直接粘贴后会在前面导入库的时候出现红色波浪线,这时直接鼠标光标移到此位置,在出现的框中点击install packege xxx,等待一会就自动安装好啦。安装好后此处不会出现红色波浪线喔。
2:代码中我适用了一个代理IP(因为我是新手,所以怕毛手毛脚下手太重网站给我IP封了)
3:源码中ThreadPoolExecutor后面的内容可以修改,这个内容就是同时工作的线程个数,合理增加会加快爬取速度,考虑到自己CPU的处理能力,不要一味增加。
4:for i in range(2,30),后面的30可以修改,意思是你所爬取的页面,最多只有136多好像,因为原网页也就只有这么多子网页了。不建议太大,免得IP被封了。
5:我在代码中设置了一个time.sleep(10),意思是下载完一张图片后10秒才会下载第二张(不要骂了别骂了,也是怕速度太快被反爬)
成果展示
在代码全部执行完毕后,在project下面会出现代码中新建的文件夹img,里面的就是爬取的成果啦,展示一下我的。
有没有很心动呢?不过一定要注意爬取的图片不要进行商用,自己保存就好啦。最后一步也很关键,右键点击生成的文件夹img,找到Mark directory as->excluded,这个步骤的作用是防止pycharm为生成的文件夹建立索引,这样日复一日pycharm使用起来会越来越卡。
到这里第一个爬虫程序创建完成啦。需要源码的评论区评论哟。