需求:有这样一个网站:http://www.5er0.com/.网站可以搜索有关电影电视剧有关的信息或者下载链接。现在要输入一个video name,爬到其下载链接。

首先我们打开网站首页:

看到有个搜索框,我们尝试输入战狼并点击搜索,得到结果如下:

既然爬虫我们就要看一下数据是如何请求的,回到首页,审查元素查看搜索框的元素:

看到这是一个post表单。

再看搜索结果页面,显示的url是这样的:

http://www.5er0.com/search.php?mod=portal&searchid=822100&searchsubmit=yes&kw=%D5%BD%C0%C7

别的字段都好理解,唯独这个searchid是个什么东西?

(省略无数实验过程,直接放出结论)

searchid表示这是整个网站的第几次搜索(所有人的搜索次数加一起),比如你前边已经有了100次搜索,那么这次就要传101.假如我们不传101会如何呢?

1 传一个比101 大的数:

显示搜索不存在

2 传一个比101小的数

比如传99,那么结果就是第99次搜索的结果(比如第99次搜索是大话西游)而不管你的关键字kw是什么。

那么显然searchid的获取极为关键。鉴于鄙人前端水平渣的可以,实在不熟悉js那一套理论,于是就动用了抓包工具fiddler4来研究searchid的获取。

首先打开fiddler和网站首页:

输入战狼

可以看到第2个url中就出现了searchid,那么显然在第一个url中获取到了searchid。

我们看一下第一个url对应报文:

文字版如下:

POST http://www.5er0.com/search.php?searchsubmit=yes HTTP/1.1
Host: www.5er0.com
Connection: keep-alive
Content-Length: 121
Cache-Control: max-age=0
Origin: http://www.5er0.com
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://www.5er0.com/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Cookie: IJKY_2132_saltkey=WB3xlz0N; IJKY_2132_lastvisit=1509431731; UM_distinctid=15f715b6341816-05f143994a3908-464a0129-1fa400-15f715b6342a79; IJKY_2132_lastact=1509959135%09portal.php%09view; IJKY_2132_sid=Ub2EJ2; CNZZDATA1264763675=1237924191-1509431778-%7C1509957167
mod=search&formhash=f62b70ea&srchtype=title&srhfid=0&srhlocality=portal%3A%3Aindex&srchtxt=%D5%BD%C0%C7&searchsubmit=true

可以看出请求url:http://www.5er0.com/search.php?searchsubmit=yes ,参数为mod=search&formhash=f62b70ea&srchtype=title&srhfid=0&srhlocality=portal%3A%3Aindex&srchtxt=%D5%BD%C0%C7&searchsubmit=true。于是尝试将http://www.5er0.com/search.php?searchsubmit=yes&mod=search&formhash=f62b70ea&srchtype=title&srhfid=0&srhlocality=portal%3A%3Aindex&srchtxt=%D5%BD%C0%C7&searchsubmit=true

输入浏览器发现可以得到预期搜索结果。这样searchid的问题就被绕过去了。

剩下的很简答了,上代码:

import re
import time
import random
import urllib
from bs4 import BeautifulSoupclass LongbuluoCrawler():SEARCH_URL = u'http://www.5er0.com/search.php?mod=search&formhash=f62b70ea&srcht' \u'ype=title&srhfid=0&srhlocality=portal::index&%s&searchsubmit=true'BASE_URL = u'http://www.5er0.com/%s'PAGE_URL = u'http://www.5er0.com/search.php?searchid=%s&searchsubmit=yes&page=%d'def _crawlSiteVideo(self, title):title = title.encode('gb2312')data = {'srchtxt': title}url = self.SEARCH_URL % urllib.urlencode(data)video_list = []url_list = []page_count = 1searchid = 0try:html = self._getHtml(url).decode('gbk')soup = BeautifulSoup(html, "html.parser")pg = soup.find_all('div', class_='pg')url_list.extend(self._getUrlList(url))if pg:  # page_count > 1pg = str(pg[0])page_count = int(re.findall('共.+?([0-9]+).+?页', pg)[0])searchid = re.findall('searchid=([0-9]+)&', pg)[0]for i in range(2, page_count+1):time.sleep(random.randint(2,6))url_list.extend(self._getUrlList(self.PAGE_URL % (searchid, i)))for url in url_list:time.sleep(random.randint(2, 6))video = self._getVideoInfo(url)if video:video_list.append(video)except:passreturn video_listdef _getUrlList(self, url):url_list = []try:soup = BeautifulSoup(self._getHtml(url).decode('gbk'), "html.parser")xs3 = soup.find_all('h3', class_='xs3')for ele in xs3:ele = str(ele)title = re.findall('target=\"_blank\">(.+?)</a>', ele)[0]title = str(title).replace('<strong><font color="#ff0000">', "")title = str(title).replace('</font></strong>', "")if self._isVideo(title):url_list.append(self.BASE_URL % re.findall('href=\"(.+?)\" target', ele)[0])except Exception,e:passreturn url_listdef _isVideo(self,str):return any(('高清' in str, '下载' in str, '百度' in str, '迅雷' in str, '网盘' in str, '在线' in str, '观看' in str))def _getVideoInfo(self,url):try:html = self._getHtml(url).decode('gbk')title = re.findall('<title>(.+?)</title>', html)[0]soup = BeautifulSoup(html, "html.parser")xg1 = soup.find_all('p',class_='xg1')author = re.findall('html">(.+?)</a>', str(xg1[0]))article_content = str(soup.find_all('td', id='article_content')[0])duration = self._time_transfer(re.findall('([0-9]+)分钟', article_content))return {"title": title, "url": url, "author": author[0] if author else None, "duration": duration}except:return Nonedef _time_transfer(self, time):try:time = int(time[0])if time > 60:return str(time/60)+":"+str(time % 60)+":00"else:return "00:"+str(time)+":00"except:return None

记一次坑爹的爬虫经历相关推荐

  1. Impala-shell卡顿分析——记一次曲折的Debug经历

    Impala-shell卡顿分析--记一次曲折的Debug经历 问题发现 最近准备在Impala中增加对UTF-8的支持,以修正跟Hive.Spark等基于Java的系统在UTF-8字符串上的不兼容表 ...

  2. mysql++裸盘_记一次裸迁 MySQL 经历

    记一次裸迁MySQL经历 前言:博主企业有一台企业阿里云机器,因为安装了云锁,造成服务器动不动就给我所死服务器.(就是那种 chattr +i /bin/bash ,分分钟日死狗 )趁着周末,Boos ...

  3. 如果当时这20道题能答好,现在应该已经被录取了(记一次面试的亲身经历 2020-8-27)

    前情提要 又一次的面试经历,下班去面试的,热情的HR,一家外企大公司,从未接触的规模与环境,满怀期待,面试的是三个中年男子,问了很多问题,真的很多,方方面面,感觉答的不是很尽善尽美,有些东西还是说不清 ...

  4. 记一次挖洞实战经历(高危信息泄露)

    记一次挖洞实战经历 前言 漏洞的发现 敏感网站的利用 总结 前言 (免责声明: 本文仅供学习和参考,切勿用于非法途径,未授权的测试皆为违法行为,一切后果自负,与本人无关) 由于也是很久没有挖洞了,所以 ...

  5. 如果当时这15道题能答好,现在应该已经被录取了(记一次面试的亲身经历 2020-7-23)

    一.前情提要 今天请假面试,上午两家,下午三家(暂定两点钟A.三点半B.四点C),全军出击的赶脚,有一家公司感觉还可以,来这家面试还真是一波三折: ① 一个不认识的猎头推荐的C(今天上午11点给我打的 ...

  6. python爬虫接单经历_记一次的接单经历

    这几天在学校里也没有什么事,就翻了翻程序接单群,想赚几个鸡腿钱,于是就找了一个看起来还挺简单的爬虫需求,接了下来 要求是爬取豆瓣2018年所有的电影信息,豆瓣算是爬虫学习必爬的一个网址了,这也是我觉得 ...

  7. 记一次node爬虫经历,手把手教你爬虫

    今天业务突然来了个爬虫业务,爬出来的数据以Excel的形式导出,下班前一个小时开始做,加班一个小时就做好了.因为太久没做爬虫了!做这个需求都是很兴奋! 需求说明 访问网站 (循环)获取页面指定数据源 ...

  8. CVPR 2021:记一次神奇的 Rebuttal 经历

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨信息门下遛狗@知乎(已授权) 来源丨https://zhuan ...

  9. 【复】从0到1的 selenium 爬虫经历

    文章目录 前言 简介与安装 定义 安装 selenium 库 安装浏览器驱动程序 测试 Selenium IDE 实战演练 例一:下载图片 例二:注册登录 代理 透明代理 匿名代理 高级匿名代理 后记 ...

最新文章

  1. I'm stuck! ccf模拟题。
  2. UML类图与类的关系详解
  3. java 序列化概念和作用_结合代码详细解读Java序列化与反序列化概念理解
  4. ubuntu21.04安装微信3.2.1(deepin-wine方式)
  5. jumpserver-v2.9.2离线安装
  6. vue路由跳转子组件_vue-router之路由钩子(组件内路由钩子必须在路由组件调用,子组件没用)...
  7. php基础教程 第三步 学习字符串及相关函数
  8. 草稿 9203 作业重点关注
  9. snmp协议_SNMP开发和使用
  10. java学习笔记之DBUtils工具包
  11. getParameter和getAttribute区别(超详细分析)
  12. C++简介(5)STL
  13. 关于学习 unity3D 的知识预储备
  14. Jenkins用户权限
  15. [笔录]博客及源程序 出处
  16. 潍坊学院计算机系宿舍,关于表彰潍坊学院第十届大学生宿舍文化节先进集体和先进个人的决定...
  17. 如何获取微信文章阅读数和点赞数
  18. 偷偷看,别让老板发现了...微信如何多开,实现工作号和私人号分离|亲测,win系列所有系统都可以实现
  19. android和MTKP60区别,联发科P60和骁龙625哪个好 骁龙625与联发科P60区别对比 (全文)...
  20. 中国光刻机获得重大突破,富士康大规模采用国产光刻机

热门文章

  1. 微信小程序 GitHub Trending Hub 上线 84 天了~
  2. 普歌-码灵团队——简述io
  3. 如何写出让CPU跑得更快的代码?
  4. 卸载 Dropbox
  5. Anacodna安装
  6. SpringMVC基于ResponseEntity的文件下载
  7. Leetcode 748 最短补全词
  8. 【CV】ConvNeXt:A ConvNet for the 2020s
  9. 【项目实战】Python实现支持向量机SVM回归模型(SVR算法)项目实战
  10. html+css(仿唯品会头部)