君苏依寂 发表于 2021-5-11 16:03:46

帮帮孩子吧

这是代码
#调用库
import urllib.request as u_request
import os,re,base64
import time
import requests

#伪装成浏览器访问
header = {}
header['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'

#打开网址
def url_open(url):

    html = requests.get(url,headers = header ).text #根据猜测来响应网页编码
    return html


#正则表达式寻找图片地址
def find_images(url):
    html = url_open(url)

    m = r'<img src="([^"]+\.jpg)"'
    match = re.findall(m,html)

    #打印图片地址
    for each in range(len(match)):
      match = 'http:' + match
      print(match)

    return match

#下载相关图片
def save_images(floder,img_addrs):
    for each in img_addrs:
      try:
            req = u_request.Request(each,headers = header)
            response = u_request.urlopen(req)
            cat_image = response.read()
            filename = each.split('/')[-1]
            with open(filename,'wb') as f:
                f.write(cat_image)
                #测试
            #print(each)

      except OSError as error:
                print(error)
                continue
      except ValueError as error:
                print(error)
                continue
#下载图片的数量
def web_link_encode(url,folder):
    for i in range(1,105):
      string_date = '20210425_'
      string_date = str(i)
      string_date = string_date.encode('utf-8')
      str_base64 = base64.b64encode(string_date)
      page_url = url + str_base64.decode() + '=#comments'
      print(page_url)
      img_addrs = find_images(page_url)
      save_images(folder,img_addrs)
      time.sleep(2)

#主函数
def download_the_graph(url):
    folder = 'graph'
    os.mkdir(folder)
    os.chdir(folder)
    web_link_encode(url,folder)

if __name__ == '__main__':
    url = 'http://jandan.net/girl/'
    download_the_graph(url)


我想问m = r'<img src="([^"]+\.jpg)"'这一句,为什么正则表达式这样写
就能匹配http://wx2.sinaimg.cn/mw600/0076BSS5ly8gqeiqg7b0fj318y0u0b29.jpg这种网址
最好解释的详细一点

代码小白liu 发表于 2021-5-11 16:03:47

君苏依寂 发表于 2021-5-11 21:25
匹配的图片地址是http://wx2.sinaimg.cn/mw600/0076BSS5ly8gqeiqg7b0fj318y0u0b29.jpg
这种
m = r'

<img src= 是网页源代码就是这样写的啊图片地址前边是啥这里就是啥啊,就是做个定位啊

南归 发表于 2021-5-11 18:46:54

([^"]+\.jpg)   先看 (),因为只有一个括号,表示取出符合括号内的链接,再往后看   ^" 表示非双引号    ,用[]框起来,再与+配合,表示 非双引号的元素出现一次或多次,
\. 表示点,    可以看https://tool.oschina.net/uploads/apidocs/jquery/regexp.html第一行, 最后以jpg结尾

总的来讲是:从src=" 开始取,如果满足 非双引号字符(至少出现一次),以.jpg结尾,则取出这个链接


个人理解

君苏依寂 发表于 2021-5-11 18:54:03

南归 发表于 2021-5-11 18:46
([^"]+\.jpg)   先看 (),因为只有一个括号,表示取出符合括号内的链接,再往后看   ^" 表示非双引号    ,用[] ...

src=什么意思
为什么是从src=开始呢,而不是前面的img

代码小白liu 发表于 2021-5-11 20:19:59

君苏依寂 发表于 2021-5-11 18:54
src=什么意思
为什么是从src=开始呢,而不是前面的img

这个应该要看网页源码了吧,你的图片地址肯定是src= “图片地址” 这样吧

君苏依寂 发表于 2021-5-11 21:25:37

代码小白liu 发表于 2021-5-11 20:19
这个应该要看网页源码了吧,你的图片地址肯定是src= “图片地址” 这样吧

匹配的图片地址是http://wx2.sinaimg.cn/mw600/0076BSS5ly8gqeiqg7b0fj318y0u0b29.jpg
这种
m = r'<img src="([^"]+\.jpg)"'
我对于
<img src=不理解,不明白这里为什么要这样写{:10_266:},你能帮帮我吧{:10_254:}

阿奇_o 发表于 2021-5-12 12:41:03

君苏依寂 发表于 2021-5-11 21:25
匹配的图片地址是http://wx2.sinaimg.cn/mw600/0076BSS5ly8gqeiqg7b0fj318y0u0b29.jpg
这种
m = r'

换个马甲就不认识了?

字符串s="src=abc123.jpg" ,用正则,你怎么找出 abc123.jpg ?

—— re.findall(r'src=(abc+.jpg)', s) 可否?
—— re.findall(r'src=(+.jpg)', s) 可否?懂?

正则表达式,说白了就是:根据这个特殊的式子,一个字符一个字符地去匹配,看是否合适

具体匹配的语法和作用,自己去菜鸟教程看看吧。有很多例子。

君苏依寂 发表于 2021-5-12 14:35:44

阿奇_o 发表于 2021-5-12 12:41
换个马甲就不认识了?

字符串s="src=abc123.jpg" ,用正则,你怎么找出 abc123.jpg ?


十分感谢{:10_254:}

君苏依寂 发表于 2021-5-12 14:36:30

代码小白liu 发表于 2021-5-11 20:19
这个应该要看网页源码了吧,你的图片地址肯定是src= “图片地址” 这样吧

十分感谢
页: [1]
查看完整版本: 帮帮孩子吧