|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
请问大佬们,这个代码怎样修改一下才能把图片都下载下来呢import requests
import logging
import re
from urllib.parse import urljoin
from os.path import exists
from os import makedirs
result_dir = 'tu'
exists(result_dir) or makedirs(result_dir)
logging.basicConfig(level=logging.INFO,format = '%(asctime)s - %(levelname)s: %(message)s')
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
}
url = 'http://md.itlun.cn/a/nhtp/list_2_{}.html'
pages = 3
def scrpae_page(url):
logging.info('scraping %s...', url)
try:
response = requests.get(url=url,headers=header)
if response.status_code == 200:
response.encoding = 'gbk'
return response
logging.error('get invalid status code %s while scrape %s',response.status_code,url)
except requests.RequestException:
logging.error('error occurred while scraping %s',url,exc_info=True)
#拼接URl,并爬取主页
def scrape_index(page):
index_url = url.format(page)
return scrpae_page(index_url)
#解析详情页url
def parse_index(html):
#logging.info('{}'.format(html))
url_pattern = re.compile('<script.*?src = "(.*?)"; </script>',re.S)
items = re.findall(url_pattern,html)
title_pattern = re.compile('<script.*?<span>(.*?)</span>.*?</script>',re.S)
titles = re.findall(title_pattern,html)
# logging.info('{}'.format(list(titles)))
return {
'名称':titles,
'detail_url':items
}
#拼接url,并调用scrpae_page
def parse_url(dict):
for base_url in dict:
detail_url = urljoin(url,base_url)
return scrpae_page(detail_url).content
#保存
def save(title,conect):
for t in title:
img_path = result_dir + '/' + t + '.jpg'
with open(img_path,'wb') as fp:
fp.write(conect)
def main():
for page in range(1,pages):
index_html = scrape_index(page)
title = parse_index(index_html.text)['名称']
details_url = parse_index(index_html.text)['detail_url']
conect = parse_url(details_url)
save(title,conect)
logging.info('保存成功')
if __name__ == '__main__':
main()
[b] import requests
import logging
import re
from urllib.parse import urljoin
from os.path import exists
from os import makedirs
result_dir = 'tu'
exists(result_dir) or makedirs(result_dir)
logging.basicConfig(level=logging.INFO,format = '%(asctime)s - %(levelname)s: %(message)s')
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
}
url = 'http://md.itlun.cn/a/nhtp/list_2_{}.html'
pages = 3
def scrpae_page(url):
logging.info('scraping %s...', url)
try:
response = requests.get(url=url,headers=header)
if response.status_code == 200:
response.encoding = 'gbk'
return response
logging.error('get invalid status code %s while scrape %s',response.status_code,url)
except requests.RequestException:
logging.error('error occurred while scraping %s',url,exc_info=True)
#拼接URl,并爬取主页
def scrape_index(page):
index_url = url.format(page)
return scrpae_page(index_url)
#解析详情页url
def parse_index(html):
#logging.info('{}'.format(html))
url_pattern = re.compile('<script.*?src = "(.*?)"; </script>',re.S)
items = re.findall(url_pattern,html)
title_pattern = re.compile('<LI>.*?><IMG id="img.*?><span>(.*?)</span></a></LI>',re.S) # 修改了正则表达式
titles = re.findall(title_pattern,html)
# logging.info('{}'.format(list(titles)))
return {
'名称':titles,
'detail_url':items
}
#拼接url,并调用scrpae_page
def parse_url(path):
detail_url = urljoin(url, path)
return scrpae_page(detail_url).content
#保存
def save(title,conect):
invalid_chars = ['\\', '/', ':', '*', '?', '"', '<', '>', '|'] # Invalid Windows characters
for char in invalid_chars:
title = title.replace(char, '')
img_path = result_dir + '/' + title + '.jpg'
with open(img_path,'wb') as fp:
fp.write(conect)
def main():
for page in range(1,pages):
index_html = scrape_index(page)
titles = parse_index(index_html.text)['名称']
details_url = parse_index(index_html.text)['detail_url']
for title, url in zip(titles, details_url):
conect = parse_url(url)
save(title,conect)
logging.info('保存成功')
if __name__ == '__main__':
main()
在修改后的代码中,我主要进行了以下几个方面的改动:
1. 解析详情页url的函数(parse_index):
我发现原先代码中的正则表达式可能无法正确匹配网页中的标题数据,所以我对其进行了修改。原本的表达式是 '<script.*?<span>(.*?)</span>.*?</script>',我修改为了 '<LI>.*?><IMG id="img.*?><span>(.*?)</span></a></LI>',这个正则表达式能够更精确地匹配网页中的标题数据。
2. 拼接URL并调用scrpae_page的函数(parse_url):
原先的代码中,这个函数接收的参数是一个字典,但是实际上我们只需要传入一个URL路径即可。因此我将这个函数的参数从字典改为了单个URL路径,这样处理后,函数的实现逻辑也变得更加清晰简单了。
3. 图片保存函数(save):
我注意到在保存图片文件的时候,如果标题中含有Windows系统不支持的特殊字符,会导致保存失败。因此,我加入了一个特殊字符的检查和替换过程。通过一个列表invalid_chars,我列出了Windows系统中文件名不支持的特殊字符,然后遍历这个列表,如果标题中含有这些字符,就将其替换为空字符。
4. 主函数(main):
我发现原来的代码中只保存了每页第一个项目的图片,而没有处理一个页面上的所有项目。因此,我在主函数中添加了一个内部的for循环,遍历每一页中的所有标题和链接,并进行下载保存,这样就可以完整地保存每一页中的所有图片了。
[/b]
|
|