Python爬虫系列(二)——Python爬虫批量下载百度图片

6 篇文章 27 订阅
订阅专栏

1. 前言

先贴代码

# -*- coding:utf8 -*-
import requests
import json
from urllib import parse
import os
import time


class BaiduImageSpider(object):
    def __init__(self):
        self.json_count = 0  # 请求到的json文件数量(一个json文件包含30个图像文件)
        self.url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&logid=5179920884740494226&ipn=rj&ct' \
                   '=201326592&is=&fp=result&queryWord={' \
                   '}&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=&copyright=&word={' \
                   '}&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&nojc=&pn={' \
                   '}&rn=30&gsm=1e&1635054081427= '
        self.directory = r"C:\Users\cun\Pictures\download\{}"  # 存储目录  这里需要修改为自己希望保存的目录  {}不要丢
        self.header = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                          'Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30 '
        }

    # 创建存储文件夹
    def create_directory(self, name):
        self.directory = self.directory.format(name)
        # 如果目录不存在则创建
        if not os.path.exists(self.directory):
            os.makedirs(self.directory)
        self.directory += r'\{}'

    # 获取图像链接
    def get_image_link(self, url):
        list_image_link = []
        strhtml = requests.get(url, headers=self.header)  # Get方式获取网页数据
        jsonInfo = json.loads(strhtml.text)
        for index in range(30):
            list_image_link.append(jsonInfo['data'][index]['thumbURL'])
        return list_image_link

    # 下载图片
    def save_image(self, img_link, filename):
        res = requests.get(img_link, headers=self.header)
        if res.status_code == 404:
            print(f"图片{img_link}下载出错------->")
        with open(filename, "wb") as f:
            f.write(res.content)
            print("存储路径:" + filename)

    # 入口函数
    def run(self):
        searchName = input("查询内容:")
        searchName_parse = parse.quote(searchName)  # 编码

        self.create_directory(searchName)

        pic_number = 0  # 图像数量
        for index in range(self.json_count):
            pn = (index+1)*30
            request_url = self.url.format(searchName_parse, searchName_parse, str(pn))
            list_image_link = self.get_image_link(request_url)
            for link in list_image_link:
                pic_number += 1
                self.save_image(link, self.directory.format(str(pic_number)+'.jpg'))
                time.sleep(0.2)  # 休眠0.2秒,防止封ip
        print(searchName+"----图像下载完成--------->")


if __name__ == '__main__':
    spider = BaiduImageSpider()
    spider.json_count = 10   # 定义下载10组图像,也就是三百张
    spider.run()

如果要使用上述程序的话,需要修改两个地方

  • self.directory 这是本地存储地址,修改为自己电脑的地址,另外,**{}**不要删
  • spider.json_count = 10 这是下载的图像组数,一组有30张图像,10组就是三百张,根据需求下载

也可以去 gitee仓库直接下载程序。

关于python爬虫入门,如何查看网页源码,可以参考我的另一篇文章 点击跳转

2. Python爬虫批量下载百度图片

流程:先分析页面,然后写爬虫程序。

打开“百度图片”,随便搜索一个词汇,例如玫瑰,可以查询到相关的图片

image-20211024132137388

  1. 分析页面

点击鼠标右键–>检查–元素,先找到第一层div

image-20211024132532939

然后往下找,可以找到一堆li,也就是以列表排列的元素,经研究发现,每个li代表一个模块,每个模块包含图像和下面的字,实际上,下面的字也带有相应链接,点击可以跳转到新页面。

image-20211024132811181

可以先数一下,包含前面的广告图片,总共也就二十多个li,也就是只包含了二十多张图像。

根据使用经验来看,鼠标滚轮下滚,会看到源源不断的图像,并不局限于二十多张图像,那么我们先下滚鼠标滚轮,看看会发生什么。(此时只有一个类名为“imgpage”的div

image-20211024134004366

鼠标滚轮下滚,类名为“imgpage”的div增加了很多,继续下滚,还会继续增加。

image-20211024134201075

由此可以得出一个结论,“百度图片”初始只会渲染部分图像到页面上,随着滚轮下滚,就会请求新的数据。而请求数据,就可以在“网络“中获取请求信息,

image-20211024134634136

打开”网络“,可以发现请求的数据非常非常多,而我们只想找刚刚请求的图像数据。

这里再了解一个新技术–XHR,关于XHR,推荐一篇文章 XHR-点击跳转,简单来说,在XHR之前,网页要获取客户端和服务器的任何状态更新,都需要刷新一次,而XHR可以不用刷新就请求到新的数据。刚才的下滚鼠标滚轮并没有刷新界面信息。

打开”网络“中的【XHR】,这里的数据都是通过XHR请求到的,通过名称可以初步判断出,请求到的文件是json格式的。

image-20211024135256750

随便点开一个文件,查看请求的url,可以发现,url很长

image-20211024135458608

比对以下不同文件的请求url,可以发现两个【pn】和【gsm】不同(gsm可以不用管它,这是通信系统)

image-20211024135832630

对比多个文件,可以看到特点:

  • pn:30
  • pn:60
  • pn:90
  • ……

下滚鼠标滚轮,会添加一个新的json文件,实际上,pn表示一组数据,一组数据包含30个图像内容,也就是第一次请求会得到30个图像,再次请求会得到另外30个图像。

现在已经分析出查询同种类型图像的url特点,那么不同类型的请求url呢?

这里又查询了一下”向日葵“,,pn也是按30、60、90进行排列的。对比”玫瑰“和”向日葵“的请求url,不同的属性增加了【logid】、【queryWord】、【word】,而【queryWord】和【word】的信息是相同的,通过名称可以看出,【queryWord】和【word】代表的是查询信息。

queryWord=%E5%90%91%E6%97%A5%E8%91%B5

这后面的信息是编码后的查询数据,至于为什么编码,是因为URL只支持一部分ASCII编码,而中文内容需要进行编码,才能用于url

使用在线URL编码工具尝试编码”向日葵“,发现与url使用中的相同

image-20211024141921177

到这里,我们可以尝试一下这个url请求

import requests  # 导入requests包

url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&logid=6991546938775238432&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%90%91%E6%97%A5%E8%91%B5&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=&copyright=&word=%E5%90%91%E6%97%A5%E8%91%B5&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=1&fr=&expermode=&nojc=&pn=30&rn=30&gsm=1e&1635046467636='
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30'}

strhtml = requests.get(url, headers=headers)  # Get方式获取网页数据
print(strhtml.text)

请求到的数据如下图所示,可以看到返回结果是json格式的。

image-20211024142333934

既然是json格式的,我们也不用BeautifulSoup进行解码了,直接根据json格式获取信息。

import requests  # 导入requests包
import json

url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&logid=6991546938775238432&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%90%91%E6%97%A5%E8%91%B5&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=&copyright=&word=%E5%90%91%E6%97%A5%E8%91%B5&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=1&fr=&expermode=&nojc=&pn=30&rn=30&gsm=1e&1635046467636='
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30'}

strhtml = requests.get(url, headers=headers)  # Get方式获取网页数据
jsonInfo = json.loads(strhtml.text)
for index in range(30):
    print(jsonInfo['data'][index]['thumbURL'])

image-20211024143135677

点击相应的链接,可以查询出相应的图像。

image-20211024143249824

  1. 编写爬虫程序

经过上面分析,基本上有了编写程序的思路。

  • 获取请求url
  • 解析出图像对应的url
  • 根据图像url下载图像

根据设计思路,编写爬虫程序

# -*- coding:utf8 -*-
import requests
import json
from urllib import parse
import os
import time


class BaiduImageSpider(object):
    def __init__(self):
        self.json_count = 0  # 请求到的json文件数量(一个json文件包含30个图像文件)
        self.url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&logid=5179920884740494226&ipn=rj&ct' \
                   '=201326592&is=&fp=result&queryWord={' \
                   '}&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=&copyright=&word={' \
                   '}&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&nojc=&pn={' \
                   '}&rn=30&gsm=1e&1635054081427= '
        self.directory = r"C:\Users\cun\Pictures\download\{}"  # 存储目录  这里需要修改为自己希望保存的目录  {}不要丢
        self.header = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                          'Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30 '
        }

    # 创建存储文件夹
    def create_directory(self, name):
        self.directory = self.directory.format(name)
        # 如果目录不存在则创建
        if not os.path.exists(self.directory):
            os.makedirs(self.directory)
        self.directory += r'\{}'

    # 获取图像链接
    def get_image_link(self, url):
        list_image_link = []
        strhtml = requests.get(url, headers=self.header)  # Get方式获取网页数据
        jsonInfo = json.loads(strhtml.text)
        for index in range(30):
            list_image_link.append(jsonInfo['data'][index]['thumbURL'])
        return list_image_link

    # 下载图片
    def save_image(self, img_link, filename):
        res = requests.get(img_link, headers=self.header)
        if res.status_code == 404:
            print(f"图片{img_link}下载出错------->")
        with open(filename, "wb") as f:
            f.write(res.content)
            print("存储路径:" + filename)

    # 入口函数
    def run(self):
        searchName = input("查询内容:")
        searchName_parse = parse.quote(searchName)  # 编码

        self.create_directory(searchName)

        pic_number = 0  # 图像数量
        for index in range(self.json_count):
            pn = (index+1)*30
            request_url = self.url.format(searchName_parse, searchName_parse, str(pn))
            list_image_link = self.get_image_link(request_url)
            for link in list_image_link:
                pic_number += 1
                self.save_image(link, self.directory.format(str(pic_number)+'.jpg'))
                time.sleep(0.2)  # 休眠0.2秒,防止封ip
        print(searchName+"----图像下载完成--------->")


if __name__ == '__main__':
    spider = BaiduImageSpider()
    spider.json_count = 10   # 定义下载10组图像,也就是三百张
    spider.run()

如果要使用上述程序的话,需要修改两个地方

  • self.directory 这是本地存储地址,修改为自己电脑的地址,另外,**{}**不要删
  • spider.json_count = 10 这是下载的图像组数,一组有30张图像,10组就是三百张,根据需求下载

测试下载3组玫瑰,程序运行情况:

image-20211024152530111

下载的玫瑰图像数据:

image-20211024152714420

10组向日葵图像:

image-20211024152653324

值得注意的是,下载过程中使用了休眠,这里设置了下载一张图像休眠0.2秒,是为了防止查询过快导致ip地址被封,更进阶的做法是添加【代理ip池】

3. 后言

爬虫还是比较好入门的,这得益于成熟的爬虫工具。

爬虫可以满足自己的个性化搜索需求,快动手试试吧。

如果觉得文章还不错的话,留个赞再走吧,非常感谢!!!

python根据关键词 批量下载百度图片到本地文件夹
04-17
python根据关键词 批量下载百度图片到本地文件夹 ,python练手小程序
使用python脚本批量下载百度图片
11-30
使用python批量下载百度图片,前提:安装python3并配置环境变量、requests库,执行脚本,输入要搜索的图片下载图片的数量、图片存储文件夹即可进行批量下载
2024年技术自媒体经验分享 —— 开始尝试认真做 CSDN 的一年后的复盘_csdn变现可行吗
2401_86022387的博客
08-19 1770
一次偶然,从朋友那里得到一份“java高分面试指南”,里面涵盖了25个分类的面试题以及详细的解析:JavaOOP、Java集合/泛型、Java中的IO与NIO、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。
2024年python爬虫实战——5分钟做个图片自动下载
2301_82244718的博客
05-01 369
Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多,通过它你能进入机器学习、数据挖掘、大数据,CS等更加高级的领域。Python可以做网络应用,可以做科学计算,数据分析,可以做网络爬虫,可以做机器学习、自然语言处理、可以写游戏、可以做桌面应用…Python可以做的很多,你需要学好基础,再选择明确的方向。这里给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
利用Python爬虫批量下载百度图库图片
02-04
利用Python爬虫批量下载百度图库图片
python批量下载百度图片
12-11
python 批量下载百度图片 , 支持关键词,目录创建,图片信息汇总,代码简单易懂,有兴趣可以下载
python批量下载百度图片程序
12-05
可以利用此程序批量下载百度图片~可以创建存储目录,自定搜索关键词,选择下载图片张数,比较人性化吧~ 需要安装python
Python实战】--批量下载百度图库图片
用余生去守护的博客
07-29 979
写作是精神的会餐,是心灵的还债,也是痛苦解脱的后花园。心灵的还债与精神的升华如影随形,人类的许多艺术创造都是精神升华的结果。
python爬虫项目——自动批量抓取m3u8网页视频
10-14
Python爬虫技术在IT行业中广泛应用于数据挖掘和自动化任务,特别是在网络视频资源的获取上。本项目专注于自动批量抓取m3u8网页视频,这是一个非常实用的技能,特别是对于那些需要收集网络视频数据的人来说。m3u8是一...
python爬虫批量爬取百度图片
12-22
#最好用的一个 # coding:utf-8 import requests import os import re # import json import itertools import urllib import sys # 百度图片URL解码 # http://blog.csdn.net/hbuxiaoshe/article/details/44780653 str_table = { '_z2C$q': ':', '_z&e3B': '.', 'AzdH3F': '/' } char_table = { 'w': 'a', 'k': 'b',
Python百度批量爬取图片
06-26
这个程序可以实现Python百度批量爬取图片,一次性最多爬取1020张图片,方便各位操作。 注:如果出现侵权事件,本平台和作者不负任何责任。
python爬虫批量下载pdf的实现
01-19
我知道用python爬虫可以批量下载,不过之前没有接触过。今天下午找了下资料,终于成功搞定,免去了手动下载的烦恼。 由于我搭建的python版本是3.5,我学习了上面列举的参考文献2中的代码,这里的版本为2.7,有些...
Python爬虫小例子——爬取51job发布的工作职位
12-17
不知从何时起,Python爬虫就如初恋一般,情不知所起,一往而深,相信很多朋友学习Python,都是从爬虫开始,其实究其原因,不外两方面:其一Python爬虫的支持度比较好,类库众多。其Pyhton的语法简单,入门容易...
万物皆可爬——亮数据代理IP+Python爬虫批量下载百度图片助力AI训练
热门推荐
努力是为了站在万人之中,成为别人的光
06-28 9万+
本文详细介绍了如何使用Python编写一个简单的爬虫,用于从百度图片搜索下载图片。通过分析目标网站、设计爬虫流程、实现代码以及配置代理IP,使得爬虫能够有效地获取图片数据。通过本项目,读者可以学习到基本的爬虫原理和实现方法,同时也了解到了如何处理异常情况和优化爬虫效率的方法。
python爬虫实现批量下载百度图片
BatFor的博客
04-22 6418
今天和小伙伴们合作一个小项目,需要用到景点图片作为数据源,在百度上搜索了一些图片,感觉一个一个手动保存太过麻烦,于是想到用爬虫下载图片。 本次代码用到了下列一些python模块,需要预先安装BeautifulSoup、requests、lxml模块。 下面直接上源代码: import re import requests from urllib import error from bs4...
python爬虫-百度图片批量下载
DistanceTiAmo的博客
08-11 286
import requests import os from urllib.parse import quote from tqdm import tqdm print('***百度图片下载***') keyword = input("输入想要下载图片的关键字吧>>>") paginator = int(input("每页30张图片,你想要几页呢→→→")) while paginator<=0: print('页数输入错误,重新输入哦 亲????>>>
python爬虫百度图片代码
最新发布
09-30
Python爬取百度图片通常会用到`requests`库来发送HTTP请求获取网页内容,然后利用如BeautifulSoup、Pandas等库解析HTML,提取出图片链接。以下是一个简单的示例,展示如何使用`beautifulsoup4`库从搜索结果页抓取图片: ```python import requests from bs4 import BeautifulSoup import os def get_baidu_image_links(keyword): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' } url = f'http://image.baidu.com/search/index?tn=baiduimage&ie=utf-8&word={keyword}' response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'lxml') # 图片链接通常在class为"i-bdimg"的元素中 img_tags = soup.find_all('a', class_='i-bdimg') image_links = [img['href'] for img in img_tags] return image_links # 下载并保存图片 def download_images(image_urls, save_dir='images'): if not os.path.exists(save_dir): os.makedirs(save_dir) for i, link in enumerate(image_urls[:10]): # 通常只下载部分图片 img_response = requests.get(link, headers=headers) with open(os.path.join(save_dir, f'image_{i+1}.jpg'), 'wb') as f: f.write(img_response.content) # 使用示例 keyword = '猫' image_links = get_baidu_image_links(keyword) download_images(image_links)
写文章

热门文章

  • Python爬虫系列(一)——手把手教你写Python爬虫 42079
  • Vue中key的作用及原理 23611
  • Android音乐播放器开发(5)—播放界面(播放、暂停、上一首、下一首,顺序播放、随机播放、拖拽进度条…) 20295
  • Python爬虫系列(二)——Python爬虫批量下载百度图片 17939
  • 非华为电脑安装华为电脑管家多屏协同 15905

分类专栏

  • Avalonia 2篇
  • Java 8篇
  • LeetCode 2篇
  • Android音乐播放器相关文章 7篇
  • 计算机原理 1篇
  • 数据结构 1篇
  • Python 6篇
  • 图像识别 3篇
  • Android 1篇
  • Vue 1篇
  • 数据库 2篇
  • C# 8篇
  • 摄影 1篇
  • 工具 6篇

最新评论

  • Python爬虫系列(二)——Python爬虫批量下载百度图片

    纸照片: 包可以的啊,run函数里的list_image_link就是所有链接

  • Python爬虫系列(二)——Python爬虫批量下载百度图片

    adxzx: 可以只保存图片链接吗

  • Python爬虫系列(二)——Python爬虫批量下载百度图片

    W_HX4: 引用「self.header = { 'User-Agent': 'Mozilla/」 调试的时候 直接从这里跳到最后 也不报错 就是下载不了

  • Android音乐播放器开发(2)—登录

    纸照片: 有的啊,刚开头我就说了代码开源了啊表情包

  • Android音乐播放器开发(6)—ListView组件创建歌曲播放列表(内含原理分析)

    m0_75071205: 大佬太棒啦

最新文章

  • C#中Json序列化的进阶用法
  • Autofac工具实现依赖注入的进阶用法
  • Avalonia创建导航菜单
2024年7篇
2022年7篇
2021年12篇
2020年16篇

目录

目录

评论 87
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纸照片

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳坪山网站建设公司网站优化基本方法天门网站排名优化哪家好网站图片优化分辨率乐昌网站优化多少钱上城区网站优化推广平台博罗网站优化哪家便宜宜宾网站优化怎么收费网站优化有几种方式阳江企业网站关键词优化报价网站seo优化找谁专业金华优化网站关键词多少钱三沙网站建设优化优化网站排名制作南京网站排名优化企业宁波如何优化网站资讯类网站怎么做优化网站seo关键字优化北海网站排名优化服务原阳县网站seo优化排名莆田网站建设优化公司如何优化网站询问b火17星优化公司网站灵巧云速捷推荐网站目录优化需要注意什么郑州网站seo优化咸宁打拱网站优化如何做百度网站优化黄山网站关键词排名优化企业新网站如何优化营销临沂网站优化体验虹口区360网站优化定制方案香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化