moozik

从avmoo.xyz抓取av番号的爬虫
20190423(avmoo.xyz工作期间不宜访问)由于GFW的原因,随时都可能被墙,所以当你看到这个文章的时候...
扫描右侧二维码阅读全文
24
2016/10

从avmoo.xyz抓取av番号的爬虫

20190423

(avmoo.xyz工作期间不宜访问)
由于GFW的原因,随时都可能被墙,所以当你看到这个文章的时候,我不保证你可以正常访问。下面正文开始。

https://tellme.pw/avmoo 可获得最新地址

分析

  1. 目标有清晰的分页和清晰的页面结构,类似下面这样的两种分页可以遍历

    https://avmoo.xyz/cn/page/2
    https://avmoo.xyz/cn/popular/page/2
    
  2. 目标并没有使用ajax加载技术,所以在数据抓取上比较简单,可以直接使用xpath
  3. 决定要抓取的信息有:链接地址,标题,番号,发行时间,影片长度,导演,导演url,制作方,制作方url,发行方,发行方url,系列,系列url,标签,演员,封面,图片个数
  4. 番号主页的链接是这样的,https://avmoo.xyz/cn/movie/5nhh,并没有使用数字编码,而是使用数字+字母的编码

方案

一开始的想法比较简单,遍历分页从分页中抓取链接地址,依次请求获取数据,存储。后来发现了一些问题,首先,avmoo.xyz/cn/page/2这个页面通过修改页数不能展示全部的番号,最大值被限定在100,avmoo.xyz/cn/popular/page/2只有这个可以展示所有番号,但是问题是,如果新添加电影信息,所有的顺序就会被打乱,所以这个方案废弃。

第二个方案,avmoo.xyz/cn/movie/5nhh,通过遍历链接的id,达到遍历所有电影的目的。

代码如下

#遍历urlid
#self.sl='0123456789abcdefghijklmnopqrstuvwxyz'
def get_linkid(self):
    for i1 in self.sl:
        for i2 in self.sl:
            for i3 in self.sl:
                for i4 in self.sl:
                    tmp=i1+i2+i3+i4
                    if self.start_id<tmp:
                        yield tmp
                    else:
                        continue

通过反复遍历一个字符串,可以获得与目标网站匹配的id,self.start_id是指开始的id,当遍历出的id比这个id大的时候才会返回给对应的函数。当程序出现错误或者接着上次末尾开始运行。

获得链接的id之后,拼接出目标的地址,就可以获取页面内的的信息了。


存储

CREATE TABLE "av_list" (
"id"  INTEGER,
"linkid"  TEXT(10) NOT NULL,
"title"  TEXT(500),
"av_id"  TEXT(50),
"release_date"  TEXT(20),
"len"  TEXT(20),
"director"  TEXT(100),
"studio"  TEXT(100),
"label"  TEXT(100),
"series"  TEXT(200),
"genre"  TEXT(200),
"stars"  TEXT(300),
"director_url"  TEXT(10),
"studio_url"  TEXT(10),
"label_url"  TEXT(10),
"series_url"  TEXT(10),
"bigimage"  TEXT(200),
"image_len"  INTEGER,
PRIMARY KEY ("linkid")
);
CREATE TABLE "av_error_linkid" (
"linkid"  TEXT(4) NOT NULL,
"status_code"  INTEGER,
"datetime"  TEXT(50),
PRIMARY KEY ("linkid")
);

完整代码

https://github.com/moozik/avmopw-spider
是肯定有坑的,一定有坑的,做好自己修改的准备。
整个站抓下来,sqlite的大小应该是100mb左右--20170427

最后修改:2019 年 04 月 23 日 04 : 55 PM

12 条评论

  1. moozik

    发现可以直连访问了,数据抓一下

  2. Geekerstar

    666,来顶一下

    1. moozik
      @Geekerstar

      谢老铁捧场了,抱拳了

  3. ZX7

    请问如何设置代理服务器? 我爬了一会儿就403了, 刚刚学.

    1. moozik
      @ZX7

      你在代码里搜索proxies就找到相关代码了,用-p参数设置代理服务器,好久没抓了,找不到好用的梯子

      1. zx7
        @moozik

        你好, 请问我这样用 speed.py -i -s 28d4 -e zzzz -p https://139.255.57.32:8080 , 这是使用上面这个代理服务器吗?
        为什么我没开SSR用上面的代码 直接显示request.error , 用了SSR就可以爬.但是不久就会出现403.
        上面的代码究竟是使用我的SSR来访问, 还是上面的免费代理服务器呢?
        PS: 大一学生,什么都不懂......

        1. moozik
          @zx7

          没开ssr出现的错误是请求错误,当然是必须开开才行。403错误是经常会有的,出现403就等着重试就行了,有个重试表,没请求到的都在里面

  4. zz

    这个网站现在怎么上不去了 翻墙也不行

    1. moozik
      @zz

      不可能啊,翻墙肯定可以上的

      1. 寒风
        @moozik

        现在真的不能上了,如果能上请告诉我方法OωO

        1. moozik
          @寒风

          那当然是自己搭梯子上了,ss就不错,vpn不是都被查了吗

  5. 游客

    66666666

发表评论