当前位置: 首页 > Web前端 > HTML5

Python爬虫入门4-100无需登录美航网就可以爬取

时间:2023-04-05 22:40:06 HTML5

图片可能不会给你增加太多有价值的技术点,因为只是一套入门教程,如果你是一个可以自动绕过老手,或者你可以带我一起去。爬虫分析首先,我们爬取了N多个用户个人主页。通过链接拼接得到了http://www.moko.cc/post/da39d。。。在这个页面,我们需要找到几个核心的重点是找到飞机拍摄点击进入图片列表页面.接下来,让我们开始代码。获取所有列表页我通过之前的博客获取了7万(实际测试了5万+)用户数据,读入python。在这个地方,我使用了一个比较好用的python库pandas。如果你不熟悉,就先模仿我的代码,我会把所有的注释都写完整。importpandasaspd#用户图片列表页面模板user_list_url="http://www.moko.cc/post/{}/list.html"#存储所有用户的列表页面user_profiles=[]defread_data():#pandasReaddatafromcsvdf=pd.read_csv("./moko70000.csv")#文末可下载文件#去除重复昵称数据df=df.drop_duplicates(["nikename"])#根据粉丝数Descendingprofiles=df.sort_values("follows",ascending=False)["profile"]foriinprofiles:#拼接链接user_profiles.append(user_list_url.format(i))if__name__=='__main__':read_data()已经获取到print(user_profiles)数据。接下来我们需要获取图片列表页面,查找规则,查看关键信息如下图。找到正确的位置是正则表达式的问题。快速写一个正则表达式.*?\((\d+?)\)

引入re,requests模块importrequestsimportre#获取图片列表页defget_img_list_page():#固定一个地址方便测试test_url="http://www.moko.cc/post/da39db43246047c79dcaef44c201492d/list.html"response=requests.get(test_url,headers=headers,timeout=3)page_text=response.textpattern=re.compile('.*?\((\d+?)\)

')#获取page_listpage_list=pattern.findall(page_text)得到结果[('/post/da39db43246047c79dcaef44c201492d/category/304475/1.html','85'),('/post/da39db43246047c79dcaef44c201492d/category/304476/1.html','2'),(/post/da39db43246047c79dcaef44c201492d/category/304473/1.html','0')]继续完善代码,发现上面获取的数据有“0”,需要过滤掉#获取图片列表页defget_img_list_page():#固定地址方便测试test_url="http://www.moko.cc/post/da39db43246047c79dcaef44c201492d/list.html"response=requests.get(test_url,headers=headers,timeout=3)page_text=response.textpattern=re.compile('.*?\((\d+?)\)

')#获取page_listpage_list=pattern.findall(page_text)#filterdataforpageinpage_list:ifpage[1]=='0':page_list.remove(page)print(page_list)得到列表页的入口,下一步就是得到所有的列表页,这个需要点击下面的链接查看http://www.moko.cc/post/da39d...这个页面有分页,4页,每页显示4*7=28条数据,所以,基本的计算公式是math.ceil(85/28)接下来生成链接,我们需要将上面的链接转换成http://www.moko.cc/post/da39db43246047c79dcaef44c201492d/category/304475/1.htmlhttp:///www.moko.cc/post/da39db43246047c79dcaef44c201492d/category/304475/2.htmlhttp://www.moko.cc/post/da39db43246047c79dcaef44c201492d/category/304475/3.htmlhttp://www.moko.cc/post/da39db44372d/post/da39db443724/category/304475/4.htmlpage_count=math.ceil(int(totle)/28)+1foriinrange(1,page_count):#正则表达式替换pages=re.sub(r'\d+?\.html',str(i)+".html",start_page)all_pages.append(base_url.format(pages))当我们之后回到足够的链接,初学者可以先做这一步,把这些链接存成csv文件,方便后续开发#获取所有页面defget_all_list_page(start_page,totle):page_count=math.ceil(int(totle)/28)+1foriinrange(1,page_count):pages=re.sub(r'\d+?\.html',str(i)+".html",start_page)all_pages.append(base_url.format(pages))print("已获取{}条数据".format(len(all_pages)))if(len(all_pages)>1000):pd.DataFrame(all_pages).to_csv("./pages.csv",mode="a+")all_pages.clear()让爬虫飞了一会,我这里拿到了80000+条数据,列表数据都有了。接下来我们继续操作这个数据,是的,不是速度有点慢,代码有点LOW,好吧,我承认这是给新手写的,但是偷懒了,我是用一篇文章改的它面向对象和多线程。获取到的数据再次分析,比如http://www.moko.cc/post/nimus...在这个页面中,我们需要获取红框的地址,为什么还是这个?因为点击这张图片后,进入里面就是完整的图片列表。我们还是使用爬虫获取几步循环我们刚才的数据列表来抓取网页的源代码。正则表达式匹配所有链接defread_list_data():#读取数据img_list=pd.read_csv("./pages.csv",names=["no","url"])["url"]#循环运行数据forimg_list_pageinimg_list:try:response=requests.get(img_list_page,headers=headers,timeout=3)exceptExceptionase:print(e)continue#正则表达式获取图片列表页面pattern=re.compile('查看更多')img_box=pattern.findall(response.text)need_links=[]#在img_box中为img捕获的图像文件夹:need_links.append(img)#创建目录file_path="./downs/{}".format(str(img[0]).replace('/',''))ifnotos.path.exists(file_path):os.mkdir(file_path)#为need创建目录inneed_links:#获取详情页图片链接get_my_imgs(base_url.format(need[1]),need[0])上面代码的几个关键点pattern=re.compile('查看更多')img_box=pattern.findall(response.text)need_links=[]#img_box中img需要抓取的图片文件夹:need_links.append(img)获取抓取目录。在这个地方,我匹配了两个部分,主要是用来创建文件夹的。创建文件夹需要os模块,记得导入#createdirectoryfile_path="./downs/{}".format(str(img[0]).replace('/',''))ifnotos.path.exists(file_path):os.mkdir(file_path)#创建目录获取详情页图片链接,然后访问抓取所有图片链接#获取详情页数据defget_my_imgs(img,title):print(img)headers={"User-Agent":"Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/68.0.3440.106Safari/537.36"}response=requests.get(img,headers=headers,timeout=3)pattern=re.compile('')all_imgs=pattern.findall(response.text)fordownload_imginall_imgs:downs_imgs(download_img,title)最后写一个下载图片的方法,代码全部完成,图片保存本地地址,时间戳用到defdowns_imgs(img,title):headers={"User-Agent":"Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/68.0.3440.106Safari/537.36"}response=requests.get(img,headers=headers,timeout=3)content=response.contentfile_name=str(int(time.time()))+".jpg"file="./downs/{}/{}"。format(str(title).replace('/','').strip(),file_name)withopen(file,"wb+")asf:f.write(content)print("Complete")运行代码,等待图片采集代码运行,发现报错的原因是路径问题,路径中出现了特殊字符...,我们需要按照上面类似的方式处理/.你自己照顾好它。得到数据,就是把这段代码中需要改进的代码分成了两部分,而且是面向过程的,非常不好。它需要改进。网络请求部分重复代码过多,需要抽象和错误处理。目前可能报错的代码都是单线程的,效率不高。可以参考前面两篇文章进行改进。没有模拟登录,最多只能抓取6张图片。这也是为什么先保存数据,方便后面直接修改。