例如 这个页面中,我们需要获取到,红色框框的地址,为什么要或者这个?因为点击这个图片之后进入里面才是完整的图片列表。
我们还是应用爬虫获取
几个步骤
循环我们刚才的数据列表
抓取网页源码
正则表达式匹配所有的链接
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 模块,记得导入一下
获取到详情页面图片链接之后,在进行一次访问抓取所有图片链接
#获取详情页面数据 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地址