基于Scrapy的全球最大成人网站PornHub爬虫
时间:2022-05-07
本文章向大家介绍基于Scrapy的全球最大成人网站PornHub爬虫,主要内容包括使用说明、数据库说明、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
首先科普下 PornHub 是个啥?
Pornhub是一个加拿大的色情影片分享网站。它是目前网上最大的色情影片网站,服务分享遍及全球。Pornhub于2007年在魁北克省蒙特利尔市成立。它是一个免费的,由广告支持的网站。除了专业色情内容,网站也提供业余色情内容。Pornhub在英国伦敦市,美国加利福尼亚州旧金山市,美国得克萨斯州休斯敦市以及美国路易斯安那州新奥尔良市均有分部和服务器。 2010年3月Pornhub被MindGeek购买,MindGeek同时拥有许多其他的色情网站。
声明:本项目旨在学习Scrapy爬虫框架和MongoDB数据库,不可使用于商业和个人其他意图。若使用不当,均由个人承担。
- 项目主要是爬取全球最大成人网站PornHub的视频标题、时长、mp4链接、封面URL和具体的PornHub链接
- 项目爬的是PornHub.com (需要访问外国网站),结构简单,速度飞快
- 爬取PornHub视频的速度可以达到500万/天以上。具体视个人网络情况,因为我是家庭网络,所以相对慢一点。
- 10个线程同时请求,可达到如上速度。若个人网络环境更好,可启动更多线程来请求,具体配置方法见 [启动前配置]
- start_requests 根据 PorbHub 的分类,启动了5个Request,同时对五个分类进行爬取。
- 并支持分页爬取数据,并加入到待爬队列。
环境
开发语言: Python2.7
开发环境: MacOS系统、4G内存
数据库: mongodb
- 主要使用 scrapy 爬虫框架
- 从Cookie池和UA池中随机抽取一个加入到Spider
- start_requests 根据 PorbHub 的分类,启动了5个Request,同时对五个分类进行爬取。
- 并支持分页爬取数据,并加入到待爬队列。
使用说明
- 安装Scrapy
- 安装Python的依赖模块:pymongo、json、requests
- 根据自己需要修改 Scrapy 中关于 间隔时间、启动Requests线程数等得配置
启动
python PornHub/quickstart.py
数据库说明
数据库中保存数据的表是 PhRes。以下是字段说明:
PhRes 表:
video_title:视频的标题,并作为唯一标识.
link_url:视频调转到PornHub的链接
image_url:视频的封面链接
video_duration:视频的时长,以 s 为单位
quality_480p: 视频480p的 mp4 下载地址
主程序
#coding:utf-8
import requests
import logging
from scrapy.spider import CrawlSpider
from scrapy.selector import Selector
from PornHub.items import PornVideoItem
from PornHub.pornhub_type import PH_TYPES
from scrapy.http import Request
import re
import json
import random
class Spider(CrawlSpider):
name = 'pornHubSpider'
host = 'https://www.pornhub.com/'
start_urls = list(set(PH_TYPES))
logging.getLogger("requests").setLevel(logging.WARNING
) # 将requests的日志级别设成WARNING
logging.basicConfig(
level=logging.DEBUG,
format= '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='cataline.log',
filemode='w')
# test = True
def start_requests(self):
for ph_type in self.start_urls:
yield Request(url='https://www.pornhub.com/%s' % ph_type,
callback=self.parse_ph_key)
def parse_ph_key(self, response):
selector = Selector(response)
logging.debug('request url:------>' + response.url)
# logging.info(selector)
divs = selector.xpath('//div[@class="phimage"]')
for div in divs:
viewkey = re.findall('viewkey=(.*?)"', div.extract()) # logging.debug(viewkey)
yield Request(url='https://www.pornhub.com/embed/%s' % viewkey[0],
callback=self.parse_ph_info)
url_next = selector.xpath( '//a[@class="orangeButton" and text()="Next "]/@href').extract()
logging.debug(url_next)
if url_next:
# if self.test:
logging.debug(' next page:---------->' + self.host + url_next[0])
yield Request(url=self.host + url_next[0],
callback=self.parse_ph_key)
# self.test = False
def parse_ph_info(self, response):
phItem = PornVideoItem()
selector = Selector(response)
_ph_info = re.findall('flashvars_.*?=(.*?);n', selector.extract())
logging.debug('PH信息的JSON:')
logging.debug(_ph_info)
_ph_info_json = json.loads(_ph_info[0])
duration = _ph_info_json.get('video_duration')
phItem['video_duration'] = duration
title = _ph_info_json.get('video_title')
phItem['video_title'] = title
image_url = _ph_info_json.get('image_url')
phItem['image_url'] = image_url
link_url = _ph_info_json.get('link_url')
phItem['link_url'] = link_url
quality_480p = _ph_info_json.get('quality_480p')
phItem['quality_480p'] = quality_480p
logging.info('duration:' + duration + ' title:' + title + ' image_url:'
+ image_url + ' link_url:' + link_url)
yield phItem
- Linux分区的注意事项以及远程连接排错
- Mysql-2
- Django---时间的时区问题
- Spring Security笔记:登录尝试次数限制
- day2、Linux别名
- 向jboss写入服务器日志
- day3、Linux快捷键及vim命令快捷键
- jboss:跟踪所有sql语句及sql参数
- django:DateTimeField如何自动设置为当前时间并且能被修改 ——django日期时间字段的使用
- logback + slf4j + jboss + spring mvc
- Oracle XE http端口8080的修改
- django之对FileField字段的upload_to的设定
- JAVA_HOME环境变量失效的解决办法
- JBOSS EAP 6.0+ Standalone模式安装成Windows服务
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PDO::errorCode讲解
- PDO::errorInfo讲解
- PHP的PDO大对象(LOBs)
- PHP抽象类与接口的区别详解
- PDO::exec讲解
- 使用keras框架cnn+ctc_loss识别不定长字符图片操作
- PHP实现的策略模式示例
- 浅谈pytorch中torch.max和F.softmax函数的维度解释
- 用PHP的反射实现委托模式的讲解
- PHP时间函数使用详解
- python批量处理多DNS多域名的nslookup解析实现
- PHP单例模式数据库连接类与页面静态化实现方法
- pytorch 常用函数 max ,eq说明
- 解析python 中/ 和 % 和 //(地板除)
- python右对齐的实例方法