鱼C论坛

 找回密码
 立即注册
查看: 1599|回复: 3

[已解决]求鱼友帮忙,爬虫问题!

[复制链接]
发表于 2017-10-16 16:34:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import urllib.request  
import os  
def url_open(url):  
    req = urllib.request.Request(url)  
    req.add_header('user-agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36')  
    response = urllib.request.urlopen(url)  
    html = response.read()  
    print(url)  
    return html  
  
def get_page(url):  
    html =url_open(url).decode('utf-8')  
    print(html)  
    a = html.find('current-comment-page') +23  
    b = html.find(']',a)  
    return html[a:b]  
  
def find_imgs(url):  
    html =url_open(url).decode('utf-8')  
    print(html)  
    img_addrs = []  
    a=html.find('img src=')  
    while a!=-1:  
        b = html.find('.jpg',a,a+255)  
        if b!=-1:  
            img_addrs.append(html[a+9:b+4])  
        else:  
            b=a+9     
        a=html.find('img src=',b)  
        print(img_addrs)  
    return img_addrs  
  
def save_imgs(folder,img_addrs):  
    for each in img_addrs:  
        filename  = each.split('/')[-1]  
        with open(filename,'wb') as f:  
            img = url_open(each)  
            f.write(img)  
  
      
def download_mm(folder='ooxx',pages=5):  
    os.mkdir(folder)  
    os.chdir(folder)  
    url = "https://jandan.net/ooxx/"  
    page_num= int(get_page(url))  
    for i in range(pages):  
        page_num += i  
        page_url=url+"page-" + str(page_num) +"#comments"  
        img_addrs = find_imgs(page_url)  
        save_imgs(folder,img_addrs)  
  
  
         
if __name__ == '__main__':  
    download_mm()  
最佳答案
2017-10-16 20:07:01
用你的代码我发现了如下几处错误与不妥
1.之所以出现上面的错误是因为,你在save_imgs的时候,请求的图片的url不对
  1. //wx2.sinaimg.cn/large/7ecfe92dly1fkk90rp9bmg20ez0bqu12.gif
复制代码

这种url放到浏览器里是可以访问的,因为默认使用了http协议,但是在python里面就需要手动添加http协议
QQ截图20171016195638.jpg
  1. with open(os.path.join(folder,filename),'wb') as f:  
  2.             img = url_open('http:'+each)  
复制代码

2.还有逻辑错误
  1. url = "https://jandan.net/ooxx/"  
  2.     page_num= int(get_page(url))  
  3.     for i in range(pages):  
  4.         page_num += i  
复制代码

这段代码你是想,获得当前页面的page数目,然后增加page数,从而获得新的页面

只是,好好观察页面的话,会发现https://jandan.net/ooxx/这个url所访问的是page=201的页面,但是201是最后一个页面,从1-201,访问202的话,是没有的
3.
  1. os.mkdir(folder)  
  2.     os.chdir(folder)
复制代码

新建文件夹,然后改变当前路径
如果文件夹存在的话,会报错,所以每次都需要删除文件夹,然后再尝试
推荐
  1. if not os.path.exists(folder):
  2.         os.makedirs(folder)
复制代码
  1. with open(os.path.join(folder,filename),'wb') as f:  
  2.             img = url_open('http:'+each)  
复制代码

4.还有就是推荐将https修改为http进行访问

下面是我修改后的
  1. import urllib.request  
  2. import os  
  3. def url_open(url):  
  4.     req = urllib.request.Request(url)  
  5.     req.add_header('user-agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36')  
  6.     response = urllib.request.urlopen(url)  
  7.     html = response.read()  
  8.     return html  
  9.   
  10. def get_page(url):  
  11.     html =url_open(url).decode('utf-8')  
  12.     a = html.find('current-comment-page') +23  
  13.     b = html.find(']',a)  
  14.     return html[a:b]  
  15.   
  16. def find_imgs(url):  
  17.     html =url_open(url).decode('utf-8')  
  18.     img_addrs = []  
  19.     a=html.find('img src=')  
  20.     while a!=-1:  
  21.         b = html.find('.jpg',a,a+255)  
  22.         if b!=-1:  
  23.             img_addrs.append(html[a+9:b+4])  
  24.         else:  
  25.             b=a+9     
  26.         a=html.find('img src=',b)  
  27.         
  28.     return img_addrs  
  29.   
  30. def save_imgs(folder,img_addrs):  
  31.     for each in img_addrs:  
  32.         filename  = each.split('/')[-1]  
  33.         with open(os.path.join(folder,filename),'wb') as f:  
  34.             img = url_open('http:'+each)
  35.             print('http:'+each)
  36.             f.write(img)  
  37.   
  38.       
  39. def download_mm(folder='ooxx',pages=5):  
  40.     if not os.path.exists(folder):
  41.         os.makedirs(folder)
  42.     url = "http://jandan.net/ooxx/"  
  43.     page_num= int(get_page(url))  
  44.     for i in range(pages):  
  45.         page_num -= i  
  46.         page_url=url+"page-" + str(page_num) +"#comments"  
  47.         img_addrs = find_imgs(page_url)  
  48.         save_imgs(folder,img_addrs)  
  49.   
  50.   
  51.          
  52. if __name__ == '__main__':  
  53.     download_mm()
复制代码

QQ截图20171016200635.jpg
1508142814(1).jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-16 20:07:01 | 显示全部楼层    本楼为最佳答案   
用你的代码我发现了如下几处错误与不妥
1.之所以出现上面的错误是因为,你在save_imgs的时候,请求的图片的url不对
  1. //wx2.sinaimg.cn/large/7ecfe92dly1fkk90rp9bmg20ez0bqu12.gif
复制代码

这种url放到浏览器里是可以访问的,因为默认使用了http协议,但是在python里面就需要手动添加http协议
QQ截图20171016195638.jpg
  1. with open(os.path.join(folder,filename),'wb') as f:  
  2.             img = url_open('http:'+each)  
复制代码

2.还有逻辑错误
  1. url = "https://jandan.net/ooxx/"  
  2.     page_num= int(get_page(url))  
  3.     for i in range(pages):  
  4.         page_num += i  
复制代码

这段代码你是想,获得当前页面的page数目,然后增加page数,从而获得新的页面

只是,好好观察页面的话,会发现https://jandan.net/ooxx/这个url所访问的是page=201的页面,但是201是最后一个页面,从1-201,访问202的话,是没有的
3.
  1. os.mkdir(folder)  
  2.     os.chdir(folder)
复制代码

新建文件夹,然后改变当前路径
如果文件夹存在的话,会报错,所以每次都需要删除文件夹,然后再尝试
推荐
  1. if not os.path.exists(folder):
  2.         os.makedirs(folder)
复制代码
  1. with open(os.path.join(folder,filename),'wb') as f:  
  2.             img = url_open('http:'+each)  
复制代码

4.还有就是推荐将https修改为http进行访问

下面是我修改后的
  1. import urllib.request  
  2. import os  
  3. def url_open(url):  
  4.     req = urllib.request.Request(url)  
  5.     req.add_header('user-agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36')  
  6.     response = urllib.request.urlopen(url)  
  7.     html = response.read()  
  8.     return html  
  9.   
  10. def get_page(url):  
  11.     html =url_open(url).decode('utf-8')  
  12.     a = html.find('current-comment-page') +23  
  13.     b = html.find(']',a)  
  14.     return html[a:b]  
  15.   
  16. def find_imgs(url):  
  17.     html =url_open(url).decode('utf-8')  
  18.     img_addrs = []  
  19.     a=html.find('img src=')  
  20.     while a!=-1:  
  21.         b = html.find('.jpg',a,a+255)  
  22.         if b!=-1:  
  23.             img_addrs.append(html[a+9:b+4])  
  24.         else:  
  25.             b=a+9     
  26.         a=html.find('img src=',b)  
  27.         
  28.     return img_addrs  
  29.   
  30. def save_imgs(folder,img_addrs):  
  31.     for each in img_addrs:  
  32.         filename  = each.split('/')[-1]  
  33.         with open(os.path.join(folder,filename),'wb') as f:  
  34.             img = url_open('http:'+each)
  35.             print('http:'+each)
  36.             f.write(img)  
  37.   
  38.       
  39. def download_mm(folder='ooxx',pages=5):  
  40.     if not os.path.exists(folder):
  41.         os.makedirs(folder)
  42.     url = "http://jandan.net/ooxx/"  
  43.     page_num= int(get_page(url))  
  44.     for i in range(pages):  
  45.         page_num -= i  
  46.         page_url=url+"page-" + str(page_num) +"#comments"  
  47.         img_addrs = find_imgs(page_url)  
  48.         save_imgs(folder,img_addrs)  
  49.   
  50.   
  51.          
  52. if __name__ == '__main__':  
  53.     download_mm()
复制代码

QQ截图20171016200635.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-10-17 13:26:04 | 显示全部楼层
昨天我也发现了默认http的问题,只是不知道咋改,真的非常感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-17 16:26:55 | 显示全部楼层
import os
import urllib.request

def url_open(url):   #请求头信息
        req = urllib.request.Request(url)
        req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36')
        response = urllib.request.urlopen(req)    #打开页面返回一个response对象
        html = response.read()  #读取response对象

        return html


def get_page(url):
        html = url_open(url).decode('utf-8')  #将读取过来的页面转码为utf-8

        a = html.find('current-comment-page')+23    #寻找下一个页面url
        b = html.find(']',a)

        return html[a:b]  #返回url



def find_imgs(url):
        html = url_open(url).decode('utf-8')   #可以在find_imgs 直接添加html参数,将url_open获取的html直接传过来,就不用再次open了
        img_adds = []

        a = html.find('img src')
        while a!=-1:

                b = html.find('jpg',a,a+255)
                if b !=-1:
                        img_adds.append(html[a+9:b+4])
                else:
                        b = a+9

                a = html.find('img src=',b)
        return img_adds




def save_imgs(folder,img_adds):
        for each in img_adds:
                each = 'http:'+each
                filename = each.split('/')[-1]
                filename = filename[-8:-1]         #将文件名处理
                each = each[:-1]   #获取到的url多了一个引号,处理掉
                print (each)
                with open(filename,'wb') as f:  
                        img = url_open(each)
                        f.write(img)



def domload_mm(folder='ooxx',page=10):
        os.mkdir(folder)    #创建目录
        os.chdir(folder)    #改变当前工作目录到指定的路径。

        url = 'http://jandan.net/ooxx/'
        page_num = int(get_page(url))   #得到第一个页面上的url num

        for i in range(page):
                page_num -= i
                page_url = url +'page-' + str(page_num) + '#comments'  #将url组装成可以爬取的url
                img_adds = find_imgs(page_url)   #寻找当前页面所有的价值信息
                save_imgs(folder,img_adds)  #保存价值信息


if __name__ == '__main__':
        domload_mm()











今天刚刚调试完的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 14:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表