欢迎加入python学习交流群 667279387
爬虫学习
爬虫学习(一)—爬取电影天堂下载链接
爬虫学习(二)–爬取360应用市场app信息

主要利用了python3.5 requests,BeautifulSoup,eventlet三个库来实现。

1、解析单个电影的详细页面
例如这个网址:http://www.dy2018.com/i/98477.html。要获取这个电影的影片名和下载地址。我们先打开这个网页来分析下这个这个网页的源代码。

包含影片名字的字段:

<div class="title_all"><h1>2017年欧美7.0分科幻片《猩球崛起3:终极之战》HD中英双字</h1></div>

包含影片下载地址的 字段:

 <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"><a href="ftp://d:d@dygodj8.com:12311/[电影天堂www.dy2018.com]猩球崛起3:终极之战HD中英双字.rmvb">ftp://d:d@dygodj8.com:12311/[电影天堂www.dy2018.com]猩球崛起3:终极之战HD中英双字.rmvb</a></td>

获取单个影片的影片名和下载链接

import re
import requests
from bs4 import BeautifulSoupurl = 'http://www.dy2018.com/i/98477.html'headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0'}def get_one_film_detail(url):#print("one_film doing:%s" % url)r = requests.get(url, headers=headers)# print(r.text.encode(r.encoding).decode('gbk'))bsObj = BeautifulSoup(r.content.decode('gbk','ignore'), "html.parser")td = bsObj.find('td', attrs={'style': 'WORD-WRAP: break-word'})if td is None:#没有找到下载标签的返回None,个别网页格式不同return None, Noneurl_a = td.find('a')url_a = url_a.stringtitle = bsObj.find('h1')title = title.string# title = re.findall(r'[^《》]+', title)[1] #此处处理一下的话就只返回影片名 本例结果为:猩球崛起3:终极之战return title, url_aprint (get_one_film_detail(url))

2、解析页面列表中所有的影片链接
先打开一个影片列表链接,例如:http://www.dy2018.com/2/index_2.html
打开查看源码可以看到每部影片都是下面这样的信息开头,然后接上影片的简单介绍,介绍我们不关心,只关心下面这段含有影片详情页面的链接,主要获取这个页面所有这样列出的影片的详情页面的链接。

<td height="26"><b><a class=ulink href='/html/gndy/dyzz/'>[最新电影]</a><a href="/i/98256.html" class="ulink" title="2017年印度7.1分动作片《巴霍巴利王(下):终结》BD中英双字">2017年印度7.1分动作片《巴霍巴利王(下):终结》BD中英双字</a></b>
</td>
import re
import requests
from bs4 import BeautifulSouppage_url = 'http://www.dy2018.com/2/index_22.html'headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0'}def get_one_page_urls(page_url):#print("one_page doing:%s" % page_url)urls = []base_url = "http://www.dy2018.com"r = requests.get(page_url, headers=headers)bsObj = BeautifulSoup(r.content, "html.parser")url_all = bsObj.find_all('a', attrs={'class': "ulink", 'title': re.compile('.*')})for a_url in url_all:a_url = a_url.get('href')a_url = base_url + a_urlurls.append(a_url)return urlsprint (get_one_page_urls(page_url))

3、多页面开始爬虫
有了前面两步骤的准备就可以进行多页面爬取数据了。

import eventlet
import re
import time
import requests
from bs4 import BeautifulSoupheaders = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0'}def get_one_film_detail(url):print("one_film doing:%s" % url)r = requests.get(url, headers=headers)# print(r.text.encode(r.encoding).decode('gbk'))bsObj = BeautifulSoup(r.content.decode('gbk','ignore'), "html.parser")td = bsObj.find('td', attrs={'style': re.compile('.*')})if td is None:return None, Noneurl_a = td.find('a')url_a = url_a.stringtitle = bsObj.find('h1')title = title.string# title = re.findall(r'[^《》]+', title)[1]return title, url_adef get_one_page_urls(page_url):print("one_page doing:%s" % page_url)urls = []base_url = "http://www.dy2018.com"r = requests.get(page_url, headers=headers)bsObj = BeautifulSoup(r.content, "html.parser")url_all = bsObj.find_all('a', attrs={'class': "ulink", 'title': re.compile('.*')})for a_url in url_all:a_url = a_url.get('href')a_url = base_url + a_urlurls.append(a_url)return urls# print(r.text.encode(r.encoding).decode('gbk'))pool = eventlet.GreenPool()
f = open("download.txt", "w")
start = time.time()for i in range(2, 100):page_url = 'http://www.dy2018.com/2/index_%s.html' % ifor title, url_a in pool.imap(get_one_film_detail, get_one_page_urls(page_url)):# print("titel:%s,download url:%s"%(title,url_a))f.write("%s:%s\n\n" % (title, url_a))
end = time.time()
print('total time cost:')
print(end - start)

前面的这段代码估计是因为用了绿色线程爬取速度过快,爬去到了20多页之后会主动给我断开,报错如下:

 raise RemoteDisconnected("Remote end closed connection without"
http.client.RemoteDisconnected: Remote end closed connection without response

优化之后的代码

import eventlet
import re
import time
import requests
from bs4 import BeautifulSoupresult = []
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0'}def get_one_film_detail(urls):req = requests.session() #此处改用session,可以减少和服务器的 tcp链接次数。req.headers.update(headers)for url in urls:print("one_film doing:%s" % url)r = req.get(url)# print(r.text.encode(r.encoding).decode('gbk'))bsObj = BeautifulSoup(r.content.decode('gbk','ignore'), "html.parser")td = bsObj.find('td', attrs={'style': re.compile('.*')})if td is None:continueurl_a = td.find('a')if url_a is None:continueurl_a = url_a.stringtitle = bsObj.find('h1')title = title.string# title = re.findall(r'[^《》]+', title)[1]f = open("download.txt", "a")f.write("%s:%s\n\n" % (title, url_a))def get_one_page_urls(page_url):print("one_page doing:%s" % page_url)urls = []base_url = "http://www.dy2018.com"r = requests.get(page_url, headers=headers)bsObj = BeautifulSoup(r.content, "html.parser")url_all = bsObj.find_all('a', attrs={'class': "ulink", 'title': re.compile('.*')})for a_url in url_all:a_url = a_url.get('href')a_url = base_url + a_urlurls.append(a_url)return urls# print(r.text.encode(r.encoding).decode('gbk'))pool = eventlet.GreenPool()
start = time.time()
page_urls = ['http://www.dy2018.com/2/']
for i in range(2, 100):page_url = 'http://www.dy2018.com/2/index_%s.html' % ipage_urls.append(page_url)for urls in pool.imap(get_one_page_urls, page_urls):get_one_film_detail(urls)end = time.time()
print('total time cost:')
print(end - start)

优化之后相当于多线程获取所有的影片的链接,再单线程去获取每个影片的下载地址。获取电影天堂上面的动作电影下载链接总共 花了

total time cost:
304.44839310646057

获取结果如下图所示

如果源码对你有用,请评论下博客说声谢谢吧~
欢迎python爱好者加入:学习交流群 667279387

爬虫学习(一)---爬取电影天堂下载链接相关推荐

  1. python3批量抓取电影天堂下载链接

    1.思路分析 首先打开电影天堂的列表页 右键审查元素查看电影简介的链接 将此链接打开可以得到下载地址 可能是爬虫原因网站审查元素和用request得到的数据不一样,因此代码的正则表达式会改变 加上列表 ...

  2. 爬虫(9)实战爬取电影天堂的1000+最新电影

    文章来因: 客官们,久等了,在家上网课,上的无聊,想看个电影放松一下,但是却不知道看啥电影,想起最近学习的爬虫,于是找电影天堂爬个电影信息,不就知道看那个电影了,上菜 菜单 文章来因: 实战内容:直接 ...

  3. Python3 爬取电影网下载链接

    废话不多说,如下代码,自行理解注释,自行分析网站dom结构 # -*- coding: utf-8 -*-__author__ = 'fengxin'import loggingimport urll ...

  4. python下载电影天堂_Python爬虫初学:爬取电影天堂数据

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于IT共享之家,作者:IT共享者 [一.项目背景] 相信大家都有一种头疼的体验,要下载 ...

  5. python爬电影_使用Python多线程爬虫爬取电影天堂资源

    最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址,代码已经上传到GitHub上了,需要的同学可以自行下载.刚开始学习python希望可以获得宝贵的意见. ...

  6. scrapy初步-简单静态爬虫(爬取电影天堂所有电影)

    之前用java写过一个简单的爬取电影天堂信息的爬虫,后来发现用python写这种简单的爬虫程序更简单,异步网络框架在不使用多线程和多进程的情况下也能增加爬取的速度,目前刚开始学scrapy,用这个写了 ...

  7. python3爬虫:爬取电影天堂电影信息

    python3爬虫:爬取电影天堂电影信息 #爬取电影天堂电影信息 #爬取电影天堂电影信息 #爬取电影天堂电影信息 from lxml import etree import requestsBASE_ ...

  8. python爬取电影天堂新片精品模块电影列表,并用迅雷下载

    python版本是3.6.5,上代码: # 爬取电影天堂 from selenium import webdriver import requests from bs4 import Beautifu ...

  9. 爬取电影天堂最新电影的名称和下载链接

    此次的目标是爬取电影天堂最新200页的最新电影的电影名称和下载链接,电影的下载链接在二级页面,所以需要先匹配一级页面的所有链接,然后逐个请求二级页面,代码如下: """爬 ...

最新文章

  1. 为什么开发中逐渐抛弃jsp(转)
  2. exit函数_全面深入了解 Python 魔法函数
  3. web开发下的各种下载方法
  4. leetcode算法题--盛最多水的容器
  5. java客户端操作zookeeper:对某个节点进行持续监听代码示例
  6. OpenCV与Eclipse结合使用(插件CDT)
  7. matlab信号分割与比对,matlab测量计算信号的相似度
  8. 上传图片至服务器,写入到数据库Blob字段中,以及从数据库读取Blob信息(iframe父子页面传值)(2)
  9. Exynos4412开发板更换开机logo图片
  10. linux 加密文件,如何运用OpenSSL 对文件进行加密和解密
  11. OpenStack_I版 5.Nova部署
  12. 论白piao的重要性
  13. html5 微信 飞机 源码,[HTML5]微信飞机大战
  14. android 色彩搭配,色彩搭配利器:最好用的配色工具App Top5
  15. bios中基本开机设置
  16. 人生之路1.20代码 第三部分
  17. Android安卓身份证识别SDK
  18. ZUI + SSM框架下数据表格的使用
  19. VBA怎样关闭工作簿和退出Excel
  20. UITextField默认输入法不是简体拼音的问题的解决方法

热门文章

  1. 追梦猪seo针对于移动端seo优化和排名技术
  2. Git Rebase vs Merge, GIt Reset vs Revert
  3. MyBatis 如果不存在则插入
  4. vue2 自定义card分页
  5. Python爬虫:按分类批量爬取环球新闻
  6. 判断iOS6/iOS7, 3.5inch/4.0inch
  7. 越野越激情——“中国东川泥石流国际汽车越野赛”
  8. 【视频处理】嵌入式硬件编码(6818)进行H264编码
  9. 学好数据库,看这9本书就够了
  10. 电子设计教程40:软启动电路-串联NTC热敏电阻