竹林小溪 发表于 2016-2-18 11:33:18

我也来爬OOXX【新科技】

本帖最后由 竹林小溪 于 2016-2-18 11:39 编辑

最近看了一些关于python的教程,觉得爬虫挺好玩的(可以爬妹纸图。。。哈哈哈。。。{:5_109:} )

@小甲鱼 老师在 《论一只爬虫的自我修养4:OOXX》 这课里利用python自带的urllib库结合html查找的方式获取图片的url地址,很容易学会也非常方便。

不过我觉得这题还可以有别的解法

①URL请求部分可以利用第三方的requests库代替python的urllib,使得原本五行代码一行就能搞定!

def url_open(url):
    return requests.get(url, headers=head)

②匹配字符串或者图片位置的时候,可以利用xpath解决,相对于正则表达式来说,既省时又省力。

def find_imgs(url):
    html_re = url_open(url).content
    xpath_img = '//*/div/div/div/p/img/@src'
    selector = etree.HTML(html_re)
    return selector.xpath(xpath_img)

完整代码:

#照着甲鱼的代码修改的
import requests
import os
import time
from lxml import etree

head = {
        ......
}

def url_open(url):
    return requests.get(url, headers=head)

def get_page(url):
    html_re = url_open(url).content
    xpath_str = '//*[@id="comments"]/div/div/span/text()'
    selector = etree.HTML(html_re)
    str = selector.xpath(xpath_str)
    return str

def find_imgs(url):
    html_re = url_open(url).content
    xpath_img = '//*/div/div/div/p/img/@src'
    selector = etree.HTML(html_re)
    return selector.xpath(xpath_img)

def save_imgs(folder, urls):
    for each in urls:
      filename = each.split('/')[-1]
      with open(filename, 'wb') as f:
            img = url_open(each).content
            f.write(img)

def main(folder, page):
    os.mkdir(folder)
    os.chdir(folder)

    url = 'http://jandan.net/ooxx/'
    page_num = int(get_page(url))

    for i in range(page):
      page_num -= i
      page_url = url + 'page-' + str(page_num) + '#comments'
      img_urls = find_imgs(page_url)
      save_imgs(folder, img_urls)
      time.sleep(0.1)

if __name__ == '__main__':
    main(folder='OOXX', page=10)



这个OOXX网站还有一个很蛋疼的问题,就是它会自动检测爬虫,那么如何解决这个问题呢{:5_94:}
**** Hidden Message *****

竹林小溪 发表于 2016-2-18 11:40:34

一楼自己占哦{:5_109:}

zooo 发表于 2016-2-18 11:43:45

给力{:9_228:}

竹林小溪 发表于 2016-2-18 12:23:16

zooo 发表于 2016-2-18 11:43
给力

感谢支持哦~

aptdo 发表于 2016-2-18 14:27:08

我也想知道有人分析了这个OOXX的反爬机制了嘛?

mlgj 发表于 2016-2-18 18:55:58

高~~~~

鱼116 发表于 2016-2-18 21:24:18

{:5_102:}

qingchen 发表于 2016-2-19 08:58:50

支持楼主!

shuofxz 发表于 2016-2-19 09:29:24

确实不错~
想问一下xpath也是第三方库么,具体怎么用呀,尤其是写正则表达式那块?

竹林小溪 发表于 2016-2-19 09:41:51

shuofxz 发表于 2016-2-19 09:29
确实不错~
想问一下xpath也是第三方库么,具体怎么用呀,尤其是写正则表达式那块?

感谢支持~{:10_254:}
是的,xpath是第三方库。主要用于解决XML数据(元素和属性)的读取。由于HTML与XML的格式相似,都是树状结构的。因此可以使用xpath来对HTML中的元素或属性进行索引。即从树的根出发,一级级分支,直到找到目标,因此不需要使用正则表达式。

shuofxz 发表于 2016-2-19 09:46:57

竹林小溪 发表于 2016-2-19 09:41
感谢支持~
是的,xpath是第三方库。主要用于解决XML数据(元素和属性)的读取。由于HTML与XML ...

原来是这样

lijunchao 发表于 2016-2-19 10:22:14

支持

z379652501 发表于 2016-2-19 10:27:53

6666666

黑龍 发表于 2016-2-19 11:36:55

支持楼主

s1986q 发表于 2016-2-19 12:36:37

楼主的谢谢你的分享。

小甲蟹66 发表于 2016-2-19 18:56:21

{:5_90:}

只爱陌生猴 发表于 2016-2-19 22:03:58

福利哦!{:5_101:}

大苹果 发表于 2016-2-20 01:39:07

支持一下

过于简单 发表于 2016-2-20 08:42:22

我喜欢哈哈!!!!

苦哈哈 发表于 2016-2-20 11:08:01

哇塞,慢慢学习python,希望有朝一日能和楼主一样,刁刁哒
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 我也来爬OOXX【新科技】