Python爬虫入门教程 4-100 美空网未登录图片爬取 (2)

例如 这个页面中,我们需要获取到,红色框框的地址,为什么要或者这个?因为点击这个图片之后进入里面才是完整的图片列表。

在这里插入图片描述


我们还是应用爬虫获取
几个步骤

循环我们刚才的数据列表

抓取网页源码

正则表达式匹配所有的链接

def read_list_data(): # 读取数据 img_list = pd.read_csv("./pages.csv",names=["no","url"])["url"] # 循环操作数据 for img_list_page in img_list: try: response = requests.get(img_list_page,headers=headers,timeout=3) except Exception as e: print(e) continue # 正则表达式获取图片列表页面 pattern = re.compile('<a hidefocus="ture" alt="http://www.likecs.com/(.*?)".*? href="http://www.likecs.com/(.*?)".*?>VIEW MORE</a>') img_box = pattern.findall(response.text) need_links = [] # 待抓取的图片文件夹 for img in img_box: need_links.append(img) # 创建目录 file_path = "./downs/{}".format(str(img[0]).replace('http://www.likecs.com/', '')) if not os.path.exists(file_path): os.mkdir(file_path) # 创建目录 for need in need_links: # 获取详情页面图片链接 get_my_imgs(base_url.format(need[1]), need[0])

上面代码几个重点地方

pattern = re.compile('<a hidefocus="ture" alt="http://www.likecs.com/(.*?)".*? href="http://www.likecs.com/(.*?)".*?>VIEW MORE</a>') img_box = pattern.findall(response.text) need_links = [] # 待抓取的图片文件夹 for img in img_box: need_links.append(img)

获取到抓取目录,这个地方,我匹配了两个部分,主要用于创建文件夹
创建文件夹需要用到 os 模块,记得导入一下

# 创建目录 file_path = "./downs/{}".format(str(img[0]).replace('http://www.likecs.com/', '')) if not os.path.exists(file_path): os.mkdir(file_path) # 创建目录

获取到详情页面图片链接之后,在进行一次访问抓取所有图片链接

#获取详情页面数据 def get_my_imgs(img,title): print(img) headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"} response = requests.get(img, headers=headers, timeout=3) pattern = re.compile('<img src2="http://www.likecs.com/(.*?)".*?>') all_imgs = pattern.findall(response.text) for download_img in all_imgs: downs_imgs(download_img,title)

最后编写一个图片下载的方法,所有的代码完成,图片保存本地的地址,用的是时间戳。

def downs_imgs(img,title): headers ={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"} response = requests.get(img,headers=headers,timeout=3) content = response.content file_name = str(int(time.time()))+".jpg" file = "./downs/{}/{}".format(str(title).replace('http://www.likecs.com/','').strip(),file_name) with open(file,"wb+") as f: f.write(content) print("完毕")

运行代码,等着收图

上传

代码运行一下,发现报错了

在这里插入图片描述


原因是路径的问题,在路径中出现了...这个特殊字符,我们需要类似上面处理/的方式处理一下。自行处理一下吧。

数据获取到,就是这个样子的

在这里插入图片描述

代码中需要完善的地方

代码分成了两部分,并且是面向过程的,非常不好,需要改进

网络请求部分重复代码过多,需要进行抽象,并且加上错误处理,目前是有可能报错的

代码单线程,效率不高,可以参照前两篇文章进行改进

没有模拟登录,最多只能爬取6个图片,这也是为什么先把数据保存下来的原因,方便后期直接改造

github代码地址与csv地址

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxysw.html