python 爬虫(xpath解析网页,下载照片)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29557137/article/details/79237186

XPath (XML Path Language) 是一门在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历。

lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据。lxml和正则一样,也是用 C 实现的,是一款高性能的 Python HTML/XML 解析器,我们可以利用之前学习的XPath语法,来快速的定位特定元素以及节点信息。

lxml python 官方文档:[http://lxml.de/index.html](http://lxml.de/index.html)

需要安装C语言库,可使用 pip 安装:pip install lxml (或通过wheel方式安装)

下面的代码实现了抓取某个婚恋网站的图片并保存到本地,通过使用xpath来解析获取图片的连接地址,然后保存到本地的。代码只实现获取一页的图片,通过分析url 【http://www.qyw520.com/user/list-1-0--0-0-0-0-0-0-0-0-0-0-0-0-0---0-0-0-2.html】的变化,可以发现页数与list后面的数字有关,如果需要回去多页的数据,只需设置一个偏移量来控制页码就可以了。

import urllib.request
import random
from lxml import etree


class MySpider:

    userName = 1
    
    def headers(self):
        """
        随机产生User-Agent的header
        :return:
        """
        headers_list = [
            "User-Agent:Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0",
            "User-Agent:Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)",
            "User-Agent:Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.0)",
            "Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1",
            "Opera/9.80(WindowsNT6.1;U;en)Presto/2.8.131Version/11.11",
            "Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;TencentTraveler4.0)",
            "Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Maxthon2.0)",
            "Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;360SE)",
            "Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1)",
        ]
        ua_agent = random.choice(headers_list)
        return ua_agent

    def load_page(self, url, header):

        headers = {"User-Agent": header}
        request = urllib.request.Request(url, headers=headers)
        response = urllib.request.urlopen(request)

        return response.read()

    def parse(self, html):
        # 解析html 为 HTML 文档
        content = html.decode("utf-8")

        selector = etree.HTML(content)
        img_links = selector.xpath('//img[@class="img"]/@src')

        for link in img_links:
            self.write_img(link)

    def write_img(self, imgurl):
        print("正在存储文件 %d ..." % self.userName)
        # 1. 打开文件,返回一个文件对象
        with open('images/' + str(self.userName) + '.png', 'wb') as f:
            # 2. 获取图片里的内容
            images = urllib.request.urlopen('http://www.qyw520.com' + imgurl)
            # 3. 调用文件对象write() 方法,将图片的内容写入到文件里
            f.write(images.read())
        print("文件 %d 保存成功!" % self.userName)
        self.userName += 1

    def main(self, url):
        header = self.headers()
        html = self.load_page(url, header)
        self.parse(html)

if __name__ == "__main__":

    url = "http://www.qyw520.com/user/list-1-0--0-0-0-0-0-0-0-0-0-0-0-0-0---0-0-0-2.html"

    myspider = MySpider()
    myspider.main(url)



猜你喜欢

转载自blog.csdn.net/qq_29557137/article/details/79237186