爬虫3-python爬取非结构化数据下载到本地

urlretrieve方法

通过上节爬虫2,可以将结构化数据存入mysql等数据库,但脚本中还存在非结构化数据:

# print(content.xpath('//*[@dd_name="大图"]/img/@src').pop())   # 图片

 python的urlretrieve方法可实现将远程数据下载本地:

#url              下载链接
#filename         指定保存本地路径文件名
#reporthook       回调函数,默认缺省
#data             post到服务器的数据,默认缺省
urlretrieve(url, filename=None, reporthook=None, data=None)

举例

# coding=utf-8
import requests
from lxml import etree

# 1爬取网页信息
url = 'http://product.dangdang.com/29148702.html'
headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/69.0.3497.81 Safari/537.36 Maxthon/5.3.8.2000 "
    }
aa = requests.get(url, headers=headers)
message = aa.content.decode('gbk')
content = etree.HTML(message)                                 # message是str格式,需要先转成HTML格式

# 1.2解析图片信息
print(content.xpath('//*[@dd_name="大图"]/img/@src').pop())   # 图片
#运行结果
http://img3m2.ddimg.cn/33/28/29148702-1_w_23.jpg
# 这时用urlretrieve来处理,可以下载到本地当前目录下
url_img=content.xpath('//*[@dd_name="大图"]/img/@src').pop()
urllib.request.urlretrieve(url_img,"test_img.jpg")

 实践

豆瓣电影爬取页面所有图片,参考该页面:

这里为什么用原网页url不行?

# coding=utf-8
import requests
import urllib.request
import json

# 1爬取网页信息
# 用原网页的url不行,把/explore#! 替换成/j/search_subjects?之后可以
# url = 'https://movie.douban.com/explore#!type=movie&tag=%E6%9C%80%E6%96%B0&page_limit=20&page_start=0'
url = 'https://movie.douban.com/j/search_subjects?type=movie&tag=%E6%9C%80%E6%96%B0&page_limit=20&page_start=0'
headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/69.0.3497.81 Safari/537.36 Maxthon/5.3.8.2000 "
    }
aa = requests.get(url, headers=headers)
message = aa.content.decode('utf-8')
json_content=json.loads(message)                              # 读取json格式
# print(json_content) 分析json结构
# 2解析json信息,并下载图片
for line in json_content['subjects']:
    img_address=line['cover']    # 图片
    rating=line['rate']
    title=line['title']
    filename=title+'_'+rating+'.jpg'
    urllib.request.urlretrieve(img_address, filename)
    print(filename+'is download.')



原文地址:https://www.cnblogs.com/foolangirl/p/14164631.html