上篇解决了编码问题,下面在得到网页文件之后,我们需要解析我们的文件,得到我们需要的内容。这里使用beautifulsoup模块。
import requests
from bs4 import BeautifulSoup
import sys
print(sys.getdefaultencoding())#utf-8
response = requests.get("https://www.autohome.com.cn/all/")
page = response.text
print(response.encoding) #ISO-8859-1
page = page.encode("ISO-8859-1").decode("gbk")
soup = BeautifulSoup(page, features='html.parser') #beautifulsoup 解析网页文件
target = soup.find(id = 'auto-channel-lazyload-article')
li_list = target.find_all(name = 'li')
for i in li_list:
a = i.find('a')
if a:
print(a.attrs.get('href'))
print(a.find('h3'))
print(a.find('img').attrs.get('src'))
运行截图:
下面我们下载对应的图片:
import requests
from bs4 import BeautifulSoup
import sys
print(sys.getdefaultencoding())#utf-8
response = requests.get("https://www.autohome.com.cn/all/")
page = response.text
print(response.encoding) #ISO-8859-1
page = page.encode("ISO-8859-1").decode("gbk")
soup = BeautifulSoup(page, features='html.parser') #beautifulsoup 解析网页文件
target = soup.find(id = 'auto-channel-lazyload-article')
li_list = target.find_all(name = 'li')
for i in li_list:
a = i.find('a')
if a:
alink = a.attrs.get('href')
atitle = a.find('h3').text
aimage = "http:" + a.find('img').attrs.get('src')
imgresponse = requests.get(aimage)
import uuid
imagename = "H:/aaaa/" + str(uuid.uuid4())+'.jpg'
with open(imagename, 'wb') as f:
f.write(imgresponse.content)
运行效果:
这里有三点需要说明:
一、atitle = a.find('h3').text
因为
atitle = a.find('h3')#.text print(type(atitle)) 得到的结果:
所以,在h3标签,作为文本输出的时候,最好使用text来得到标题。
二、UUID
所有的UUID它可以保证在空间和时间上的唯一性. 它是通过MAC地址, 时间戳, 命名空间, 随机数, 伪随机数来保证生成ID的唯一性, 有着固定的大小( 128 bit ). 它的唯一性和一致性特点使得可以无需注册过程就能够产生一个新的UUID. UUID可以被用作多种用途, 既可以用来短时间内标记一个对象, 也可以可靠的辨别网络中的持久性对象.
python的uuid模块提供UUID类和函数uuid1(), uuid3(), uuid4(), uuid5() 来生成1, 3, 4, 5各个版本的UUID ( 需要注意的是: python中没有uuid2()这个函数). 对uuid模块中最常用的几个函数总结如下:
1. uuid.uuid1([node[, clock_seq]]) : 基于时间戳
使用主机ID, 序列号, 和当前时间来生成UUID, 可保证全球范围的唯一性. 但由于使用该方法生成的UUID中包含有主机的网络地址, 因此可能危及隐私. 该函数有两个参数, 如果 node 参数未指定, 系统将会自动调用 getnode() 函数来获取主机的硬件地址. 如果 clock_seq 参数未指定系统会使用一个随机产生的14位序列号来代替.
2. uuid.uuid3(namespace, name) : 基于名字的MD5散列值
通过计算命名空间和名字的MD5散列值来生成UUID, 可以保证同一命名空间中不同名字的唯一性和不同命名空间的唯一性, 但同一命名空间的同一名字生成的UUID相同.
4. uuid.uuid4() : 基于随机数
通过随机数来生成UUID. 使用的是伪随机数有一定的重复概率.
5. uuid.uuid5(namespace, name) : 基于名字的SHA-1散列值
通过计算命名空间和名字的SHA-1散列值来生成UUID, 算法与 uuid.uuid3() 相同.
import uuid
# make a UUID based on the host ID and current time
print(uuid.uuid1())
# make a UUID using an MD5 hash of a namespace UUID and a name
print(uuid.uuid3(uuid.NAMESPACE_DNS, "weizu"))
# make a random UUID
print(uuid.uuid4())
# make a UUID using a SHA-1 hash of a namespace UUID and a name
print(uuid.uuid5(uuid.NAMESPACE_DNS, 'weizu'))
运行截图:
三、with ... as:
当处理一个文件对象时, 使用 with 关键字是非常好的方式。在结束后, 它会帮你正确的关闭文件。 而且写起来也比 try - finally 语句块要简短。
如:
语句块要简短:
>>> with open('/tmp/foo.txt', 'r') as f:
... read_data = f.read()
作者:无涯明月