数据分析专栏

python爬虫:用request最简单的代码爬取图片,以及Xp

2019-06-25  本文已影响72人  Viva_Stephen

最近这段时间自己一直在学习数据分析这一块,其中关于数据收集方面就可以用到爬虫。那么自己也想把最近所学的一些知识分享给大家。

爬虫的方式有很多种,我觉得比较方便的selenium和request,这篇文章介绍request的方式,末尾附上代码。

首先来看爬取图片的布骤:
1、抓取网页url
2、找到自己想要爬取的内容,并解析内容(这里是所有布骤最难的)
3、保存图片包括(文件夹的路径,图片名称)
4、翻页爬取
学会以上的基本布骤基本上是OK啦,有些高手还会加入判断,或者多线程运行等等,哎算了。。。

对了在开始之前,需要引入包,这里我们会用到request抓取包,os路径保存包,etree解析包

import os
import requests
from lxml import etree

然后开始我们的爬取,这里我们用果壳网的在行来实验。
这个网站:


微信截图_20190625120429.png

最终的结果是图片和人名,这样子


微信图片_20190625121238.png

打个码,

网址是这个:

[https://www.zaih.com/falcon/mentors?first_tag_id=342&first_tag_name=%E4%BA%92%E8%81%94%E7%BD%91%2B&second_tag_id=374&second_tag_name=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&page=7](https://www.zaih.com/falcon/mentors?first_tag_id=342&first_tag_name=%E4%BA%92%E8%81%94%E7%BD%91%2B&second_tag_id=374&second_tag_name=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&page=1)

一、爬取网页的主要代码

pic_hxml=requests.get(url,headers=headers)

url是网页的网址
headers是头部,在网页爬取中,很多网站会有反爬的设施,而头部一般来说是一个身份验证一样的代码,模拟人的操作。一般来说头部用User-Agent的代码,这个因个人电脑而异。

headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}

二、解析与找寻内容
我们用etree来解析网页,大家可看到。

html=etree.HTML(pic_hxml.text)
    pic1="//section[@class='flex']/img[@class='mentor-card__avatar']/@src"
    name1="//div[@class='flex align-center wrapper']/span[@class='mentor-card__name']/text()"
    pic2=html.xpath(pic1)
    name2=html.xpath(name1)

其中最难的就是 pic1和name1的寻找了,我在这里是用工具帮忙的利用谷歌浏览器,安装“Xpath Helper”插件。


工具.png

a.安装好后点击插件,你可看到弹出两个小框框
b.按住shift+ctrl,鼠标移动到哪,就需要提取的代码了。
c.适当缩短内容,达到遍历整个网页。


xpath_heper使用.png

我们要的结果是这个:


结果.png

然后按同样的方式提取名字,注意文字后要加"/text()"才能显示。
最后用name2=html.xpath(name1),就完成了提取。

三、保存文件

1、设置文件路径,文件名和图片的url

用for循环解封name和pic

    for name,pic in zip(name2,pic2):
        imgurl=pic#这是图片的url
        path1=os.path.abspath('D:/Users/17617/PycharmProjects/untitled/爬虫练习库/刘亦菲')#这是文件的报春路径
        img_name=name+'.jpg'#图片的名字。别忘了'.jpg'不然图片没法看
        imgpath=os.path.join(path1,img_name)#将路径与文件名结合

2、保存
很简单的三行代码,提取图片,打开设置好的“路径名称盒子”,用“wb"表示写入,然后将图片放进去。

 response=requests.get(imgurl)
    with open (imgpath,'wb') as f:
        f.write(response.content)

四、如果你想用循环提取图片,多看几分钟刷刷的快感,这里就需要设置翻页。

for i in range(1,7,1):
    url='https://www.zaih.com/falcon/mentors?first_tag_id=342&first_tag_name=%E4%BA%92%E8%81%94%E7%BD%91%2B&second_tag_id=374&second_tag_name=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&page='+str(i)

我们这里设置for循环,i
通常url='www.……'+str(i)
完成翻页设置,当然不同的网页,翻页的方法也不同,但用心寻找还是可以找到规律的,然后根据规律进行循环。

那么我的爬虫是按这些布骤写的,利用函数关系将4个布骤进进行连接。
完整代码:

import os
import requests
from lxml import etree

#保存设置
def down_load(imgpath,imgurl):
    response=requests.get(imgurl)
    with open (imgpath,'wb') as f:
        f.write(response.content)
        # shutil.copyfileobj(response.raw,f)
        f.close()

headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}

#提取内容
def pic_url(url,headers):
    pic_hxml=requests.get(url,headers=headers)
    html=etree.HTML(pic_hxml.text)
    pic1="//section[@class='flex']/img[@class='mentor-card__avatar']/@src"
    name1="//div[@class='flex align-center wrapper']/span[@class='mentor-card__name']/text()"
    pic2=html.xpath(pic1)
    name2=html.xpath(name1)
    for name,pic in zip(name2,pic2):
        imgurl=pic
        path1=os.path.abspath('D:/Users/17617/PycharmProjects/untitled/爬虫练习库/刘亦菲')
        img_name=name+'.jpg'#别忘了'.jpg'不然图片没法看
        imgpath=os.path.join(path1,img_name)
        print('正在下载',img_name)
        print('正在下载', imgurl)
        down_load(imgpath,imgurl)

#翻页设置
for i in range(1,7,1):
    url='https://www.zaih.com/falcon/mentors?first_tag_id=342&first_tag_name=%E4%BA%92%E8%81%94%E7%BD%91%2B&second_tag_id=374&second_tag_name=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&page='+str(i)
    pic_url(url,headers)

希望对还在学习爬虫的朋友能够起到帮助作用,如果你还在学习,最好自己能够尝试一下其他的网站,不断练习试错和总结。

有什么问题欢迎在下方留言提问。
本人正在深圳学习数据分析,我的微信是:fxfrom2013
欢迎加我互相交流,互相学习。

上一篇 下一篇

猜你喜欢

热点阅读