爬虫练习案例2
爬取站长素材的图片素材(https://sc.chinaz.com/)
使用语言: python
使用库: [如果在你的 IDE 有红色波浪线表示还没下载这个库]
urllib.request
lxml
内的etree
- 网页解析
pycharm下载 lxml
文件 > 设置 > 项目:xxx > python解释器 > “
+
”(alt
+Ins
) > 搜索lxml
> 安装软件包
爬取思路:
获取数据(xpath)
和上一次练习的步骤一致
- 请求对象定制 (request)
- 模拟浏览器访问页面 (response)
- 获取内容 (content)
下载图片到本地(urlretrieve)
# coding=utf-8
import urllib.request
from lxml import etree
def create_request(page):
if page == 1:
url = 'https://sc.chinaz.com/tupian/chouxiangtupian.html'
else:
url = 'https://sc.chinaz.com/tupian/chouxiangtupian_' + str(page) + '.html'
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36",
}
request = urllib.request.Request(url=url, headers=headers)
return request
def get_content(request):
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
return content
# 下载图片
def down_load(content):
# urllib.request.urlretrieve('图片名字', '文件的名字')
tree = etree.HTML(content)
# //div//img/@data-original
# //div//img/@alt
name_list = tree.xpath('//div//img/@alt')
src_list = tree.xpath('//div//img/@data-original')
# print(len(name_list), len(src_list))
for i in range(len(name_list)):
name = name_list[i]
src = src_list[i]
url = 'https:' + src
urllib.request.urlretrieve(url=url, filename='./chouxiangimg/'+ name+'.jpg')
if __name__ == '__main__':
start_page = int(input("请输入起始页码:"))
end_page = int(input("请输入结束页码:"))
for page in range(start_page, end_page+1):
# 请求对象定制
request = create_request(page)
content = get_content(request)
down_load(content)
执行结果
会在当前目录下已有的chouxiangimg文件夹内下载网站
[起始页面]
-[结束页面]
的所有图片
拓展知识
解析本地文件 - etree.parse('xx.html')
解析服务器文件 - etree.HTML(content)
xpath的基本语法(返回一个列表)
tree = etree.HTML(content)
list = tree.xpath(“↓语法↓”)
// : 查找所有子孙节点, 不考虑层级关系
/ : 查找所有的直接子节点
//div[@id] : 查找所有有id的节点
//div[@id="id"] : 查找所有id为"id"的节点
//div[contains(@id, "he")] : 模糊查询,查询所有id有"he"字的节点
//div[starts-with(@id, "he")] : 顾名思义
//div[@id="id" and id="id2"] : 查询所有id为"id"和所有
/text() : 获取选择器当中的内容
/@<css属性名> : 获取选择器对应的css属性值