上网址:https://pic.netbian.com/4kmeinv/
前面几步其实都一样,导入模块,指定url和headers,发起请求,获得请求数据
import requests
from lxml import etree
import os
# if not os.path.exists('./meinv'):
# os.mkdir('./meinv')
url='https://pic.netbian.com/4kmeinv/'
headers={
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0'
}
response=requests.get(url=url,headers=headers)
# response.encoding='utf-8'
page_list=response.text
然后是xpath的特色 将网页树化根据树化页面找到我们需要的特定的数据
tree=etree.HTML(page_list)
li_list=tree.xpath('//div[@class="slist"]/ul/li')
for li in li_list:
se_src='https://pic.netbian.com'+li.xpath('./a/img/@src')[0]
se_name=li.xpath('./a/img/@alt')[0]+'.jpg'
se_name=se_name.encode('iso-8859-1').decode('gbk')
最后持久化存储
img_data=requests.get(url=se_src,headers=headers).content
img_path='meinv'+se_name
with open (img_path,'wb') as fp:
fp.write(img_data)
print (se_name+' finish')
今天遇到的几个问题主要有
树化页面时tree=etree.HTML…我写成了.xpath 这属于**的一个错误
第二个就是 部分代码输错后报错为 IndexError: list index out of range 超出列表范围或者列表不存在,这里很显然是列表不存在
第三个是 出现乱码时的处理方式
response.encoding=‘utf-8’ se_name=se_name.encode(‘iso-8859-1’).decode(‘gbk’)
这两个换着试,不可以一起试
第四个是 持久化存储时
w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
第五个是刚刚发现的 持久还存储时img_path里面文件夹后应该加/否则python把它当作字符串处理
总代码:
import requests
from lxml import etree
import os
# if not os.path.exists('./meinv'):
# os.mkdir('./meinv')
url='https://pic.netbian.com/4kmeinv/'
headers={
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0'
}
response=requests.get(url=url,headers=headers)
# response.encoding='utf-8'
page_list=response.text
tree=etree.HTML(page_list)
li_list=tree.xpath('//div[@class="slist"]/ul/li')
# fp=open('./')
for li in li_list:
se_src='https://pic.netbian.com'+li.xpath('./a/img/@src')[0]
se_name=li.xpath('./a/img/@alt')[0]+'.jpg'
se_name=se_name.encode('iso-8859-1').decode('gbk')
# print(se_name,se_src)
img_data=requests.get(url=se_src,headers=headers).content
img_path='meinv/'+se_name
with open (img_path,'wb') as fp:
fp.write(img_data)
print (se_name+' finish')
最后 附上mm图片
再来一个