利用Scrapy编写“1024网站种子吞噬爬虫”,送福利

时间:2024-10-21 20:53:47

在爬取东西之前,我们需要简单分析一下小草网站的结构。爬虫,是依照URL来爬取的,那么我们首先来分析一下小草的URL吧。

  1. 1# 不骑马的日本人板块
  2. 2http:///?fid=2&search=&page=2
  3. 3# 骑马的日本人板块
  4. 4http:///?fid=15&search=&page=2
  5. 5# 英语老师板块
  6. 6http:///?fid=4&search=&page=2
  7. 复制代码

这是挑选了几个不同的板块之间的URL,我们发现,他们就是fid=XX这个数字不同啊。传入不同的page参数,应该就是第几页。这样,我们就能连续的爬取不同page之间的信息了。

爬到页面了,我们接下来就是要找每个页面的post了,这就要涉及到html的知识了。由于这些页面长的都一样,他们的结构也都是差不多的,所以,我们随便选取一个页面,来看看他post的html长什么样子。

  1. 1<td class="tal" style="padding-left:8px" id="">
  2. 2 <h3><a href="htm_data/15/1805/" target="_blank" id="">[MP4/ 1.53G] SDMU-742 和歌山から来たリアルマゾ女子 [vip1136]</a></h3>
  3. 3</td>
  4. 复制代码

找到,关键信息在这里,这个 <a> 标签里。我们看到href="htm_data/15/1805/"这个应该就是每一个帖子的后半段URL,前半段应该是域名。最后的那个数字,应该是帖子的ID,每一个帖子都有唯一的ID与之对应。标签中包裹的文字是帖子的标题,那么好,我们就拿到这个URL来拼接出每一个帖子的地址,然后在Scrapy的Spider里面yeild出来。

  1. 1http:///htm_data/15/1805/
  2. 复制代码

因为我们的目的是要拿到:每个帖子的标题,帖子的预览图,还有帖子的种子文件。

既然我们已经拿到了帖子的URL,那么我们就接着来爬第二层:帖子。

在每个帖子的html文件中,我们需要找到两个东西:一是缩略图,二是种子的下载地址。经过简单的点击右键,检查,发现这两个东西的html代码长这个样子:

  1. 1<!--图片-->
  2. 2<br>
  3. 3 <img src='/v2/XXX/XXX/' onclick="XXXXXX" style='cursor:pointer'>
  4. 4<br>
  5. 5<!--种子文件-->
  6. 6<a target="_blank" onmouseover="='#DEF5CD';" onmouseout="='none';" style="cursor:pointer;color:#008000;" href="/?http://www______rmdown______com/link______php?hash=XXXXXX&z">/?hash=XXXXXX</a>
  7. 复制代码

这样,就可以找了图片的标签<img>和种子文件的下载地址的标签<a>,但是,这里就有个问题,每一个post的html里面,如果找<img>标签的话,会找到很多图片,好多图片都不是我们想要的,这里就得根据src里面的值来区分,我这里只是找了文件格式是非gif图片,并且只挑选了前三个作为image_url来存储起来。而种子文件的下载地址,这就是<a>标签包裹的内容就可以。

在这一层,我们拿到了post的标题,图片,还有种子文件的下载URL。那么我们下一步就是,去爬取下载种子文件的URL。这就到了爬虫的第三层。

在第三层里面,这里只有一个download按钮,所以,我们只需要看每个种子的下载地址的url就可以了。

  1. 1http:///?reff=495894&ref=182a4da555f6935e11ff2ba0300733c9769a104d51c
  2. 复制代码

这个URL很有意思,里面最关键的信息,就是reff和ref,然而,这两个值的位置,在网页的html文件中是可以找到的:

  1. 1<INPUT TYPE="hidden" NAME="reff" value="495894">
  2. 2<INPUT TYPE="hidden" name="ref" value="182a4da555f6935e11ff2ba0300733c9769a104d51c">
  3. 复制代码

在这个文件里面,name的值为reff和ref是唯一的两个标签,这样就炒鸡好找,然后拿到他们的value值,拼凑一下,就成了电影种子文件的的下载地址。

拿到下载地址,我们就只需要用python进行网络请求,然后,将返回数据保存成torrent文件就可以了。这里有个小插曲:本来我尝试着用urllib3来做的,但是发现urllib3在网络请求的时候,会卡顿,这样很不爽,我google,发现这个问题还是很普遍的,有一个人就建议用“人类最伟大的库”requests来做请求。果然,名头不是盖的,requests轻松解决了我的烦恼,以后就粉requests了,太强大了。

OK,走到这里,我们就算是爬完了一个post,那么将爬取的信息,yield出来一个Scrapy的Item,再在pipeline中,我们将item存储到MongoDB中,就完成啦。当这一步做完,爬虫会接着爬取下一个post或者page,直到爬取结束。

过程就是这么简单,光说不练是不行滴,尤其是咱们 程序员,既得会纸上谈兵,又得会实战操练。那么我们就看一下运行时的效果,绝对震撼:

运行效果

记录结果的txt文件

本地保存的种子文件113MB

MongoDB中的数据

技术要点

  • Python 3.6
  • Scrapy
  • 在Scrapy发起网络请求的时候,为了避免被网站封杀,我们这在request里添加了Cookie和User-Agent。
  • 用BeautifulSoup4来做html的解析,因为我发现,Scrapy提供的selector不是很好用,不如bs4强大。
  • 中的DOWNLOAD_DELAY需要设置一下。
  • 存入MongoDB的时候,按照不同的板块存到不同的表里。
  • 在本地建一个txt文件,将结果按照csv格式写入,这样做是为了将爬取结果实时的记录下来,而不是等待爬虫运行完之后,再将结果写成csv文件。方便为其他程序提供数据。
  • torrent文件的名字需要做处理,因为帖子的标题里面有些非法字符是不能做文件路径的,所以要对名字做一下处理。