澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

澳门新萄京官方网站:使用Python编写简单网络爬

2019-08-03 作者:www.8455.com   |   浏览(170)

前言:因为自己还是python世界的一名小学生,还有很多路要走,所以本文以目的为向导,达到目的即可,对于那些我自己都没弄懂的原理,不做去做过多解释,以免误人子弟,大家可以网上搜索。

使用Python编写简单网络爬虫抓取视频下载资源,python爬虫

我第一次接触爬虫这东西是在今年的5月份,当时写了一个博客搜索引擎,所用到的爬虫也挺智能的,起码比电影来了这个站用到的爬虫水平高多了!

回到用Python写爬虫的话题。

Python一直是我主要使用的脚本语言,没有之一。Python的语言简洁灵活,标准库功能强大,平常可以用作计算器,文本编码转换,图片处理,批量下载,批量处理文本等。总之我很喜欢,也越用越上手,这么好用的一个工具,一般人我不告诉他。。。

因为其强大的字符串处理能力,以及urllib2,cookielib,re,threading这些模块的存在,用Python来写爬虫就简直易于反掌了。简单到什么程度呢。我当时跟某同学说,我写电影来了用到的几个爬虫以及数据整理的一堆零零散散的脚本代码行数总共不超过1000行,写电影来了这个网站也只有150来行代码。因为爬虫的代码在另外一台64位的黑苹果上,所以就不列出来,只列一下VPS上网站的代码,tornadoweb框架写的 澳门新萄京官方网站 1

[[email protected] movie_site]$ wc -l *.py template/*
  156 msite.py
   92 template/base.html
   79 template/category.html
   94 template/id.html
   47 template/index.html
   77 template/search.html

下面直接show一下爬虫的编写流程。以下内容仅供交流学习使用,没有别的意思。

以某湾的最新视频下载资源为例,其网址是

因为该网页里有大量广告,只贴一下正文部分内容:

澳门新萄京官方网站 2

对于一个python爬虫,下载这个页面的源代码,一行代码足以。这里用到urllib2库。

>>> import urllib2
>>> html = urllib2.urlopen('http://某piratebay.se/browse/200').read()
>>> print 'size is', len(html)
size is 52977

当然,也可以用os模块里的system函数调用wget命令来下载网页内容,对于掌握了wget或者curl工具的同学是很方便的。

使用Firebug观察网页结构,可以知道正文部分html是一个table。每一个资源就是一个tr标签。

澳门新萄京官方网站 3

而对于每一个资源,需要提取的信息有:

1、视频分类
2、资源名称
3、资源链接
4、资源大小
5、上传时间

就这么多就够了,如果有需要,还可以增加。

首先提取一段tr标签里的代码来观察一下。

<tr>
  <td class="vertTh">
   <center>
    <a href="/browse/200" title="此目录中更多">视频</a><br />
    (<a href="/browse/205" title="此目录中更多">电视</a>)
   </center>
  </td>
  <td>
<div class="detName">   <a href="/torrent/7782194/The_Walking_Dead_Season_3_Episodes_1-3_HDTV-x264" class="detLink" title="细节 The Walking Dead Season 3 Episodes 1-3 HDTV-x264">The Walking Dead Season 3 Episodes 1-3 HDTV-x264</a>
</div>
<a href="magnet:?xt=urn:btih:4f63d58e51c1a4a997c6f099b2b529bdbba72741&dn=The Walking Dead Season 3 Episodes 1-3 HDTV-x264&tr=udp://tracker.openbittorrent.com:80&tr=udp://tracker.publicbt.com:80&tr=udp://tracker.istole.it:6969&tr=udp://tracker.ccc.de:80" title="Download this torrent using magnet"><img src="//static.某piratebay.se/img/icon-magnet.gif" alt="Magnet link" /></a>   <a href="//torrents.某piratebay.se/7782194/The_Walking_Dead_Season_3_Episodes_1-3_HDTV-x264.7782194.TPB.torrent" title="下载种子"><img src="//static.某piratebay.se/img/dl.gif" class="dl" alt="下载" /></a><img src="//static.某piratebay.se/img/11x11p.png" /><img src="//static.某piratebay.se/img/11x11p.png" />
   <font class="detDesc">已上传 <b>3 分钟前</b>, 大小 2 GiB, 上传者 <a class="detDesc" href="/user/paridha/" title="浏览 paridha">paridha</a></font>
  </td>
  <td align="right">0</td>
  <td align="right">0</td>
 </tr>

下面用正则表达式来提取html代码中的内容。对正则表达式不了解的同学,可以去 了解一下。

为何要用正则表达式而不用其他一些解析HTML或者DOM树的工具是有原因的。我之前试过用BeautifulSoup3来提取内容,后来发觉速度实在是慢死了啊,一秒钟能够处理100个内容,已经是我电脑的极限了。。。而换了正则表达式,编译后处理内容,速度上直接把它秒杀了!

提取这么多内容,我的正则表达式要如何写呢?

根据我以往的经验,“.*?”或者“. ?”这个东西是很好使的。不过也要注意一些小问题,实际用到的时候就会知道 澳门新萄京官方网站 4

对于上面的tr标签代码,我首先需要让我的表达式匹配到的符号是

<tr>

表示内容的开始,当然也可以是别的,只要不要错过需要的内容即可。然后我要匹配的内容是下面这个,获取视频分类。

(<a href="/browse/205" title="此目录中更多">电视</a>)

接着我要匹配资源链接了,

<a href="..." class="detLink" title="...">...</a>

再到其他资源信息,

font class="detDesc">已上传 <b>3 分钟前</b>, 大小 2 GiB, 上传者

最后匹配

澳门新萄京官方网站:使用Python编写简单网络爬虫抓取视频下载资源,Python与简单网络爬虫的编写。</tr>

大功告成!

当然,最后的匹配可以不需要在正则表达式里表示出来,只要开始位置定位正确了,后面获取信息的位置也就正确了。

对正则表达式比较了解的朋友,可能知道怎么写了。我Show一下我写的表达式处理过程,

澳门新萄京官方网站 5

就这么简单,结果出来了,自我感觉挺欢喜的。

当然,这样设计的爬虫是有针对性的,定向爬取某一个站点的内容。也没有任何一个爬虫不会对收集到的链接进行筛选。通常可以使用BFS(宽度优先搜索算法)来爬取一个网站的所有页面链接。

完整的Python爬虫代码,爬取某湾最新的10页视频资源:

# coding: utf8
import urllib2
import re
import pymongo
db = pymongo.Connection().test
url = 'http://某piratebay.se/browse/200/%d/3'
find_re = re.compile(r'<tr>. ?(. ?">(. ?)</a>. ?class="detLink". ?">(. ?)</a>. ?<a href="(magnet:. ?)" . ?已上传 <b>(. ?)</b>, 大小 (. ?),', re.DOTALL)
# 定向爬去10页最新的视频资源
for i in range(0, 10):
    u = url % (i)
    # 下载数据
    html = urllib2.urlopen(u).read()
    # 找到资源信息
    for x in find_re.findall(html):
        values = dict(
            category = x[0],
            name = x[1],
            magnet = x[2],
            time = x[3],
            size = x[4]
        )
        # 保存到数据库
        db.priate.save(values)
print 'Done!'

以上代码仅供思路展示,实际运行使用到mongodb数据库,同时可能因为无法访问某湾网站而无法得到正常结果。

所以说,电影来了网站用到的爬虫不难写,难的是获得数据后如何整理获取有用信息。例如,如何匹配一个影片信息跟一个资源,如何在影片信息库和视频链接之间建立关联,这些都需要不断尝试各种方法,最后选出比较靠谱的。

曾有某同学发邮件想花钱也要得到我的爬虫的源代码。
要是我真的给了,我的爬虫就几百来行代码,一张A4纸,他不会说,坑爹啊!!!……

都说现在是信息爆炸的时代,所以比的还是谁的数据挖掘能力强 澳门新萄京官方网站 6

好吧,那么问题来了学习挖掘机(数据)技术到底哪家强?澳门新萄京官方网站 7澳门新萄京官方网站 8澳门新萄京官方网站 9

回到用Python写爬虫的话题。

爬虫的基本概念


关于爬虫的基本概念, 推荐博客https://xlzd.me/ 里面关于爬虫的介绍非常通俗易懂.
简单地说,在我们输入网址后到可以浏览网页,中间浏览器做了很多工作, 这里面涉及到两个概念:

  • IP地址: IP地址是你在网络上的地址,大部分情况下它的表示是一串类似于192.168.1.1的数字串。访问网址的时候,事实上就是向这个IP地址请求了一堆数据。
  • DNS服务器: 而DNS服务器则是记录IP到域名映射关系的服务器,爬虫在很大层次上不关系这一步的过程。一般浏览器并不会直接向DNS服务器查询的IP,这个过程要复杂的多,包括向浏览器自己、hosts文件等很多地方先查找一次,上面的说法只是一个统称。
    浏览器得到IP地址之后,浏览器就会向这个地址发送一个HTTP请求。然后从网站的服务器端请求到了首页的HTML源码,然后通过浏览器引擎解析源码,再次向服务器发请求得到里面引用过的Javascript、CSS、图片等资源,得到了网页浏览时的样子。

版权声明:本文为作者原创文章,可以随意转载,但必须在明确位置表明出处!!!

友情提示:本代码用到的网址仅供交流学习使用,如有不妥,请联系删除。

我需要一个python网络爬虫的索引,可以帮忙做一个

  1. “网络爬虫的索引” 啥意思?

2.关于爬虫,我早就帮你们写好了教程了。
帖子内容太多,就不再贴了,全都在这里:
如何用Python,C#等语言去实现抓取静态网页 模拟登陆网站

里面有所有的,原理,逻辑,示例代码,包括C#和Python的。

(此处不给贴地址,请自己用Google搜标题,即可找到帖子地址)  

Python一直是我主要使用的脚本语言,没有之一。Python的语言简洁灵活,标准库功能强大,平常可以用作计算器,文本编码转换,图片处理,批量下载,批量处理文本等。总之我很喜欢,也越用越上手,这么好用的一个工具,一般人我不告诉他。。。

搭建实验环境

import requests # 网页下载工具
from bs4 import BeautifulSoup # 分析网页数据的工具
import re # 正则表达式,用于数据清洗整理等工作
import os # 系统模块,用于创建结果文件保存等
import codecs # 用于创建结果文件并写入

2 爬虫的实现
编写爬虫之前,我们需要先思考爬虫需要干什么、目标网站有什么特点,以及根据目标网站的数据量和数据特点选择合适的架构。
推荐使用Chrome的开发者工具来观察网页结构。对应的快捷键是"F12"。
右键选择检查(inspect)即可查看选中条目的HTML结构。

一般,浏览器在向服务器发送请求的时候,会有一个请求头——User-Agent,它用来标识浏览器的类型.
如果是python代码直接爬,发送默认的User-Agent是python-requests/[版本号数字]
这时可能会请求失败,因为服务器会设置通过校验请求的U-A来识别爬虫,通过模拟浏览器的U-A,能够很轻松地绕过这个问题。
设置Use-Agent请求头, 在代码'User-Agent':后就是虚拟的浏览器请求头.

def fetch_html(url_link):
    html = requests.get(url_link, 
                    headers={'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'}).content
return html

DOWNLOAD_URL = 'http://usefulenglish.ru/phrases/'
html = fetch_html(DOWNLOAD_URL)

上面这段代码可以将url_link中网址的页面信息全部下载到变量html中.
之后调用Beautifulsoup解析html中的数据.

#!/usr/bin/python
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://www.jb51.net" class="sister" id="link1">Elsie</a>,
<a href="http://www.jb51.net" class="sister" id="link2">Lacie</a> and
<a href="http://www.jb51.net" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
soup = BeautifulSoup(html_doc) 
print soup.title # 输出:<title>The Dormouse's story</title>
print soup.title.name # 输出:title
print soup.title.string # 输出: The Dormouse's story
print soup.p # 输出: <p class="title"><b>The Dormouse's story</b></p>
print soup.a # 输出:<a class="sister" href="http://www.jb51.net" id="link1">Elsie</a>
print soup.find_all('a') 
print soup.find(id='link3')
print soup.get_text()

soup 就是BeautifulSoup处理格式化后的字符串
soup.title得到的是title标签
soup.p 得到的是文档中的第一个p标签
soup.find_all(‘p’) 遍历树, 得到所有的标签’p’匹配结果
get_text() 是返回文本, 其实是可以获得标签的其他属性的,比如要获得a标签的href属性的值,可以使用 print soup.a['href'],类似的其他属性,比如class也可以这么得到: soup.a['class'])

用Beautifulsoup解析html文件, 就可以获得需要的网址数据等文件. 下面这段代码是用来获取字段中的url链接的:

def findLinks(htmlString):
    """
    搜索htmlString中所有的有效链接地址,方便下次继续使用
    htmlString = ‘<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>'类似的字符串
    """
    linkPattern = re.compile("(?<=href="). ?(?=")|(?<=href='). ?(?=')")
    return linkPattern.findall(htmlString)

通过上一遍文章我们对python的基础语法和正则表达式有了一定的了解,从这边文章开始我们将进入实战,大家不要害怕,学习爬虫我们首先要做的是定一个目标,要相信没有爬不下来的东西,毕竟网页都是人写得,它们也遵循html规则,关于html标签语言可以到菜鸟教材·去稍微了解一下。这里我们通过爬取糗事百科的段子来作为python3爬虫系列的第一个教程,因为糗事百科基本上是静态网页,所以这类网页是是最好爬取的网页,非常适合爬虫的入门教程。

背景:自己有台电脑要给老爸用,老爷子喜欢看一些大片,但是家里网络环境不好,就想批量下载一些存到电脑里。但是目前大部分的网站都是这样的,

python新手 一段网络爬虫的简单小程序 有些语法以及功可以不太懂 指点

#将b里面的元素全部追加到a里面,保证不重复def union(a, b): #b里面的所有元素 for e in b: #如果不在a里面 if e not in a: a.append(e)def crawl_web(seed): # returns index, graph of inlinks #列表 tocrawl = [seed] #列表 crawled = [] #字典 graph = {} # <url>, [list of pages it links to] #字典 index = {} #不为空 while tocrawl: #赋值给page,并删除最后一个 page = tocrawl.pop() #保证不重复的添加 if page not in crawled: #下面是各种函数的调用 content = get_page(page) add_page_to_index(index, page, content) outlinks = get_all_links(content) graph[page] = outlinks union(tocrawl, outlinks) crawled.append(page) return index, graph  

我第一次接触爬虫这东西是在今年的5月份,当时写了一个博客搜索引擎,所用到...

因为其强大的字符串处理能力,以及urllib2,cookielib,re,threading这些模块的存在,用Python来写爬虫就简直易于反掌了。简单到什么程度呢。我当时跟某同学说,我写电影来了用到的几个爬虫以及数据整理的一堆零零散散的脚本代码行数总共不超过1000行,写电影来了这个网站也只有150来行代码。因为爬虫的代码在另外一台64位的黑苹果上,所以就不列出来,只列一下VPS上网站的代码,tornadoweb框架写的

正则表达式

实际使用中,用Beautifulsoup应该可以处理绝大多数需求,但是如果需要对爬去下来的数据再进一步分析的话,就要用到正则表达式了.

大多数符号在正则表达式中都有特别的含义,所以要作为匹配模式的话,就必须要用符号转义.例如搜索'/a', 对应的正则表达式是'/a'
[]代表匹配里面的字符中的任意一个
[^]澳门新萄京官方网站:使用Python编写简单网络爬虫抓取视频下载资源,Python与简单网络爬虫的编写。代表除了内部包含的字符以外都能匹配,例如pattern1 = re.compile("[^p]at")#这代表除了p以外都匹配
正则表达式中()内的部分是通过匹配提取的字段.

基本用法,例如得到的url字符串后,需要截取最后一个/符号后的字段作为保存的文件名:

topic_url='http://usefulenglish.ru/phrases/bus-taxi-train-plane'
filename_pattern=re.compile('.*/(.*)$')
filename = filename_pattern.findall(topic_url)[0] '.txt'

得到:
filename = 'bus-taxi-train-plane.txt'

最后给出完整代码. 这段代码实现了对英文学习网站()中phrase栏目下日常口语短语的提取.代码的功能主要分为两部分:
1)解析侧边栏条目的url地址, 保存在url_list中
2)下载url_list中网页正文列表中的英文句子.
网站页面如下:

澳门新萄京官方网站 10

image.png

import requests
from bs4 import BeautifulSoup
import re
import os
import codecs

def findLinks(htmlString):
    """
    搜索htmlString中所有的有效链接地址,方便下次继续使用
    """
    linkPattern = re.compile("(?<=href="). ?(?=")|(?<=href='). ?(?=')")
    return linkPattern.findall(htmlString)

def fetch_html(url_link):
    html = requests.get(url_link, 
                    headers={'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'}).content
    return html

DOWNLOAD_URL = 'http://usefulenglish.ru/phrases/'

html = fetch_html(DOWNLOAD_URL)

soup = BeautifulSoup(html, "lxml")

side_soup = soup.find('div', attrs={'id': 'sidebar'})

url_pattern = re.compile('^[<a]')
start = 0
url_list = []
for items in side_soup.find_all('li'):
    if url_pattern.findall(str(items)):
        url = findLinks(str(items))
        if url == []:
            start = start   1
            continue
        else:
            if start == 1:
                url_list.append(url[0])
            else:
                continue

filename_pattern=re.compile('.*/(.*)')

for topic_url in url_list[5]:
    html = []
    soup = []
    page_soup = []
#    topic_url = 'http://usefulenglish.ru/phrases/time'
    print(topic_url)
    html = fetch_html(topic_url)
#    print(html)
    soup = BeautifulSoup(html)
    page_soup = soup.find('div', attrs={'class':'body'})
#    print(page_soup)

    filename = filename_pattern.findall(topic_url)[0] '.txt'
#    print(filename)
    if not os.path.exists(filename):
        os.system('touch %s' % filename)

    outfile = codecs.open(filename, 'wb', encoding='utf-8')
    ftext = []

    pattern = re.compile('^[a-zA-Z]')

    for table_div in page_soup.find_all('p'):
        text = table_div.getText()
        if pattern.findall(text):
            line = re.sub('(.*)|?|.|/|,','', text)
            ftext.append(line)

    with codecs.open(filename, 'wb', encoding='utf-8') as fp:
        fp.write('{ftext}n'.format(ftext='n'.join(ftext)))

urllib和re(正则表达式模块)

爬虫,爬虫,就是把网上的内容爬到本地来,urllib模块的作用就是把网页上的内容去回到本地来,urllib是封装了http协议,至于http协议是怎么回事本篇内容不做讨论,http协议会在该系列之后的文章中对它做出详细的讲解。这里我们只需要知道urllib的作用是将网页上的内容取回到本地。取回到本地后它就是文本信息了,而要从文本信息中提取我们需要的信息就需要我们使用re模块(正则表达式模块)。

澳门新萄京官方网站 11

[[email protected] movie_site]$ wc -l *.py template/*
  156 msite.py
   92 template/base.html
   79 template/category.html
   94 template/id.html
   47 template/index.html
   77 template/search.html

附录: 正则表达式


澳门新萄京官方网站 12

参考:
使用request爬:https://zhuanlan.zhihu.com/p/20410446
爬豆瓣电影top250(网页列表中的数据):
https://xlzd.me/2015/12/16/python-crawler-03
Beautifulsoup使用方法详解: http://www.jb51.net/article/43572.htm
Beautifulsoup官网文档: https://www.crummy.com/software/BeautifulSoup/bs4/doc/
http://www.169it.com/article/9913111281939258943.html
Python正则表达式:
http://www.runoob.com/python/python-reg-expressions.html
http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

查看页面元素

首先我们来看一下糗事百科的主页长什么样子

澳门新萄京官方网站 13

4-1 糗百主页

从主页上可以看到每一个用户发表的一条段子都是一块,一块的分割开的。这就是html标签语言<div>...</div>的作用,如果你对htm标签语言不熟习,可以花个半天时间去了解了解,了解html标签语言有助于更好的理解网页的布局,当然对你编写正则表达式规则也有莫大的帮助。

需要一个个地点进去,才能看到下载地址

下面直接show一下爬虫的编写流程。以下内容仅供交流学习使用,没有别的意思。

F12开发则工具

浏览器上都自带了开发则工具,只要你是web开发人员,这个工具你肯定会使用到,不管你是调试JS,还是css都会用到此工具。当然我们爬虫程序更需要用到此工具了,下面我们在糗事百科的页面按下键盘上的F12将会出现下面界面。

澳门新萄京官方网站 14

4-2 开发者工具

当然你看到的界面可能和我的不一样,这是浏览器不同造成的,我使用的是Chrome浏览器,如果你们使用的是IE或者Firefox浏览器按下F12肯定和我的是不一样的。

澳门新萄京官方网站 15

以某湾的最新视频下载资源为例,其网址是

Elements、Network

按下F12后在出现的界面中有一行菜单栏,这里我们主要用到Elements、Network两个菜单

  • Elements: 元素,指的是当前网页元素(如果是静态网页那么在当前页面右键鼠标-->查看网页源代码所看到的页面元素和这里看到的页面元素是一样的,只是这里的看到的元素是格式化了的,方便开发人员查看)
  • Network: 网络,指的是浏览器和web服务器发生的所有网络交互

如果我要下载100部电影,那肯定手都要点断了,于是便想把这些地址给爬取出来,迅雷批量下载。

快速定位元素

在Elements菜单下移动鼠标到<div class="article block untagged mb15 typs_long" id="qiushi_tag_119595801"></div>项,可以看到页面上有“遇奸”这个用户的块区域被选中了。

澳门新萄京官方网站 16

4-3 快速定位

可以看到Elements菜单下有很多类是<div class="...">...</div>这样的标签,每一对这样的标签表示包含一个用户的所有信息,所以我们要查看“遇奸”这个用户发布的段子,那么肯定是在<div class="article block untagged mb15 typs_long" id="qiushi_tag_119595801"></div>之间了。

工具:python(版本3.x)

因为该网页里有大量广告,只贴一下正文部分内容:

快速的定位到发表的段子

  1. 点击菜单栏最左边的按钮。
  2. 滑动鼠标到发表的段子上。
    是的只需要两步,你可以看到开发则工具界面就定位到发布的段子上了。

澳门新萄京官方网站 17

4-4 快速定位指定元素

爬虫原理:网页源代码中含有下载地址,把这些零散的地址批量保存到文件中,方便使用。

 澳门新萄京官方网站 18

是时候表演真正的技术了

通过上面的介绍我们对页面的基本元素已经有所了解了,那么如何从页面元素中获取用户发表的段子呢,这里我们定一个目标,我们需要获取用户名用户ID段子好笑数、如果用户发表的是图片我们还需要获取图片的url地址,下面正则表达式这位英雄就要登场了。

干货:首先上代码,迫不及待的你可以先运行一下,再看详细介绍。

对于一个python爬虫,下载这个页面的源代码,一行代码足以。这里用到urllib2库。

获取段子

当然最重要的就是段子了,我们的目的不就是为了爬取段子吗。首先我们在糗百页面右键鼠标-->产看页面源代码,然后**Ctrl

  • a(全选)Ctrl c(复制)**, 然后粘贴到正则表达式在线测试工具中。

澳门新萄京官方网站 19

4-5 正则表达式在线工具

我们先通过在线工具来测试我们写的正则表达式是否正确。

import requests
import re

#changepage用来产生不同页数的链接
def changepage(url,total_page):
    page_group = ['https://www.dygod.net/html/gndy/jddy/index.html']
    for i in range(2,total_page 1):
        link = re.sub('jddy/index','jddy/index_' str(i),url,re.S)
        page_group.append(link)
    return page_group
#pagelink用来产生页面内的视频链接页面
def pagelink(url):
    base_url = 'https://www.dygod.net/html/gndy/jddy/'
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'}
    req = requests.get(url , headers = headers)
    req.encoding = 'gbk'#指定编码,否则会乱码
    pat = re.compile('<a href="/html/gndy/jddy/(.*?)" class="ulink" title=(.*?)/a>',re.S)#获取电影列表网址
    reslist = re.findall(pat, req.text)

    finalurl = []
    for i in range(1,25):
        xurl = reslist[i][0]
        finalurl.append(base_url   xurl)
    return finalurl #返回该页面内所有的视频网页地址

#getdownurl获取页面的视频地址
def getdownurl(url):
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'}
    req = requests.get(url , headers = headers)
    req.encoding = 'gbk'#指定编码,否则会乱码
    pat = re.compile('<a href="ftp(.*?)">ftp',re.S)#获取下载地址
    reslist = re.findall(pat, req.text)
    furl = 'ftp' reslist[0]
    return furl


if __name__ == "__main__" :
    html = "https://www.dygod.net/html/gndy/jddy/index.html"
    print('你即将爬取的网站是:https://www.dygod.net/html/gndy/jddy/index.html')
    pages = input('请输入需要爬取的页数:')
    p1 = changepage(html,int(pages))
    with open ('电影天堂下载地址.lst','w') as f :
        j = 0
        for p1i in p1 :
            j = j   1
            print('正在爬取第%d页,网址是 %s ...'%(j,p1i))
            p2 = pagelink(p1i)
            for p2i in p2 :
                p3 = getdownurl(p2i)
                if len(p3) == 0 :
                    pass
                else :
                    finalurl = p3
                    f.write(finalurl   'n')
    print('所有页面地址爬取完毕!')

>>> import urllib2
>>> html = urllib2.urlopen(')
>>> print 'size is', len(html)
size is 52977
当然,也可以用os模块里的system函数调用wget命令来下载网页内容,对于掌握了wget或者curl工具的同学是很方便的。

爬取思想

在解决一个事情之前我们首先要做的是先在脑子里想一想该怎么去解决这个问题,第一步做什么、第二步做什么、最后做什么、爬虫也一样我们首先要去想一想怎么去爬到我们需要的信息。从文章的前半部分开发者工具截图的Elements可以看出每个用户的信息都是包含在一对<div class="...">...</div>之中的,所以我们的第一步是把每个用户的所有信息取出来。

  • 第一步:取出包含在<div class="..">...</div>中的所有信息
  • 第二步:从第一步的结果中取出该用户发布的段子、用户名、用户ID、url图片地址、好笑数

首先取出包含在<div class="..">...</div>中的所有信息,正则表达式如下:

<div class="article block untagged mb15.*?</div>

鼠标点击[测试匹配]发现匹配结果为[没有匹配],如下图

澳门新萄京官方网站 20

4-6 正则表达式在线工具

这是怎么回事呢,点符号表示匹配任何字符除换行符外,星号表示匹配前面出现的正则表达式零次或多次,问号表示非贪婪匹配,非贪婪匹配的意思是尽可能少的匹配,我会在后面的章节中详细说明。按理说我们的正则表达式是没有问题的啊?这里需要特别主要了从上一篇聚沙成塔--爬虫系列(三)(正则表达式)文章介绍我们知道点符号匹配任何字符串(除换行符外),所以这里我们不能用点符号来匹配了,我们需要用到特殊符号s表示匹配所有的空白符,S表示匹配左右的非空白符,所以这两个符号的组合就表示匹配所以字符包括换行符,下面我们改写正则如下:

<div class="article block untagged mb15[sS]*</div>

鼠标点击[测试匹配]发现匹配结果为[没有匹配],如下图

澳门新萄京官方网站 21

4-7 正则表达式在线工具

结果显示了我们匹配到了25个结果,这25个结果正好是糗百一页发布的数量,也表示一页上有25个用户, 但是这个时候我们查看结果的时候发现并没有包含段子内容,为什么呢?是因为我们的正则表达式匹配到</div>结束,但是在最外层的</div class="...">...</div>之中还有类似的div对,所以就不会匹配到最外层的</div>结束标记,修改正则表达式如下:

<div class="article block untagged mb15[sS]*?class="stats-vote".*?</div>

核心模块**getdownurl函数:**通过requests来获取页面信息,可以认为这个信息的text就是页面源代码(几乎任何一款浏览器右键都有查看网页源代码的选项),再通过re.compile正则表达式匹配的方式来匹配到网页源代码中的网址部分,可以看下图

使用Firebug观察网页结构,可以知道正文部分html是一个table。每一个资源就是一个tr标签。

取用户名、用户ID、段子、图片url地址

通过上一步我们已经取到了25个用户的所有信息,那么用户名和用户ID等等需要从这25个用户信息中获取到。这里我们又要回到开发者工具,通过上面所讲的操作,可以轻松定位到用户名,用户ID,段子

澳门新萄京官方网站 22

4-8 定位用户名,用户ID,段子内容

可以发现用户ID是在herf后面,用户名是在<h2>...</h2>之间,段子是在<span>...</span>之间的,所以我们需要的正则表达式如下:

<a href="(.*?)".*?<h2>(.*?)</h2>.*?<div class="content">(.*?)</div>

澳门新萄京官方网站 23

 澳门新萄京官方网站 24

代码实现

from urllib import request
import re
url = 'https://www.qiushibaike.com'
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'
headers = {'User-Agent': user_agent}

# 构建一个请求对象
req = request.Request(url, headers=headers)
# 打开一个url
response = request.urlopen(req)
# 读取服务器返回的页面数据内容
content = response.read().decode('utf-8')
# 匹配所有用户信息
#pattern  = re.compile(r'<div class="article block untagged mb15[sS]*?<a href="(.*?)".*?<h2>(.*?)</h2>.*?<div class="content">(.*?)</div>',re.S)
pattern = re.compile(r'<div class="article block untagged mb15[sS]*?class="stats-vote".*?</div>', re.S)
userinfos = re.findall(pattern, content)
print(len(userinfos))

pattern = re.compile(r'<a href="(.*?)".*?<h2>(.*?)</h2>.*?<div class="content">(.*?)</div>', re.S)
for userinfo in userinfos:
    item = re.findall(pattern, userinfo)
    #print(item)
    userid, name, content = item[0]
    # 去掉换行符,,<br/>符号
    userid = re.sub(r'n|||<br/>', '', userid)
    name = re.sub(r'n|||<br/>', '', name)
    content = re.sub(r'n|||<br/>', '', content)
    print((userid, name, content))

 

而对于每一个资源,需要提取的信息有:

运行结果

('/users/34093917/', '杨槐树的花香', '逛商场,一美女把一条大狗拉到商场里了。样子很吓人。估计碰到一个男的,吓得他大叫一声:我的个妈呀,拉好你老公行不?美女不愿意说男的骂她。两人纠缠看热闹的越来越多,大家看美女把狗拉到商城都反感一边倒支持男的。人群中有人说话,着男的怎么这样,说狗是人家老公,真没素质。美女听到有人替她说话又硬气三分。另一个人回答就是,哪狗明明是人家儿子……x01[生气了]x01[生气了]x01[生气了]')
('/users/24703920/', '甜甜橙※', '去浴池洗澡,发现一个大姐老是偷偷看我,也没在意!等我准备穿衣服的时候,偷瞄一眼大姐已经穿好了!突然大姐“嗖”的飘到我跟前,用手揉了一把我 咪 咪,嘴里碎碎念:“这么大这么好看居然是真的?!真的?!”我擦。。。')
('/users/226122/', '想爱爱就别给老婆', '阴天,LZ白天在家一直睡觉,3岁儿子在客厅玩耍一会跑过来问我:妈妈,你睡觉,睡醒了吗?一会又跑回来问:妈妈,你可以起床了吗?好吧,知道你无聊没事做了')
('/users/21674803/', '小晓超人', '我这个人最怕别人跟我比!若果你满世界的乱拉屎,我就可以把屎糊满你的全世界!')
('/users/31240860/', '残落之辉', '不知道有几个人有类似的经历。当你走在大街上,突然听见一苍老又陌生的声音在叫你的小名,你以为是许久未见的长辈而满怀激动的心情转过身时……却看见一只小土狗撒着欢的冲向一位老人……别拦我,让我咬死那只狗!!!')
('/users/34710929/', '星舞飞碟', '上公交车遇到一奶奶带一小孩,小孩又哭又闹,吵的全车人不得安宁,后来一高中生问他奶奶:你家小孩多少钱?瞬间不哭了')
('/users/32215536/', '吃了两碗又盛', '那天一朋友被他儿子的班主任请去谈话,回来时一脸俄罗斯方块。问他怎么了,他说:马 勒戈壁的,这小兔 崽 子不知道跟哪个王 八犊 子学会了说脏话!')
('/users/30381978/', 'LOVE蓝可', '单身狗一枚 去参加朋友婚礼  结果把车炸成这样了,注定孤独一生吧')
('/users/30476775/', '我的个脑子呀', '分享#今天早上去帮弟弟买作业本的时候遇到弟弟的好朋友在骑自行车,速度很快结果没刹住车一头撞在了树上,我本来想关心他一下,可是想到了前几天发生的事,我竟大笑了起来。。。。。。弟弟的这个好朋友,刚刚买了一辆自行车勤学苦练终于学会了,可不久之后听弟弟说他掉进了粪坑,然后不久又钻进了水沟,有一次来我家找我弟弟玩就把车停在了大门外,我爸说让他推进家里来,可是他就是不听说没事,和弟弟玩了一会他们正准备出去玩,可是发现他的自行车不见啦,最后他们找啊找啊急得不得了就是找不到,吓得不敢回家,就去了他奶奶家,(他奶…查看全文')
('/users/21447817/', '嘟嘟豆豆5', '洗洗睡觉了!!')
('/users/30998801/', '红尘一笑醉红颜~', '深 夜 缠 绵,情到深处忍不住呻 吟 浅 唱,老公说你小声点,我说不要,那样憋着多难受啊……然后他直接吻住我的嘴,把我憋的“呜呜”叫,奶奶的,一脚给他踹下去了,他委屈的爬起来告诉我,他听到隔壁有说话的声音,怕人家听到.....我说“你不在家我每天听他们家叫,现在也该让他们尝尝我的厉害了!”.....')
('/users/21821649/', '卟溫柔', '闺蜜老公感冒了,让我开车捎他们两口子去医院打针。看完医生去打针,只见那个小护士很利索的把针头扎了进去,闺蜜问她老公有感觉没?她老公看了看那么细的针头,说这么细,扎进去能有啥感觉?闺蜜看了她老公一眼说:“老公,你终于体会到我的感受了......”x01[惊讶]x01[惊讶]x01[惊讶]我是不是发现了什么x01[doge]x01[doge]x01[doge]')
('/users/12679679/', 'o初恋o', '一个客户在我早上熟睡之际因为订单问题给我电话,我爱发嗲,加上没睡醒更是软绵绵的声音,然后连着5天他每天早上都给我打电话喊我起床,关键我凌晨三四点才睡觉的,可烦死人啦')
('/users/31973521/', '锤子是主谋', '背景:“国庆回家过了半个月荒诞的生活。一直没有运动,回到上海锻炼一小时以后喝了口冰水开始胃疼。”我:“医生我锻炼了以后胃疼什么情况?以前没发生过这种事。”医生:“你不用紧张,这种情况不用吃药,过一会自己就好了。”我:“谢谢,那耽误我晚上喝酒不?”医生:“那我还是给你开点药吧。”我:......')
('/users/16696217/', '黄半仙Demigo…', '男:,,,,,,女:。。。。。。男:好女:来接我')
('/users/13521795/', '哥裤裆有杀气', '万恶的马赛克(转)')
('/users/30683297/', '傻妞也', '老师:“凡事要争第一,第二和倒数第一没什么区别。”小宝:“为什么?”老师:“我举个例子,你说世界上最高的山峰是什么峰?”小宝:“不知道啊,啥峰啊?”')
('/users/31087078/', '大冰冰儿儿', '别再自欺欺人了,鹿晗关晓彤俩人就是在一起了,我和彭于晏也要宣布了请大家不要伤心我们会幸福的[微笑]       @所有人')
('/users/9005124/', '男人不将就', '同事儿子六岁,上幼儿园。经常被一同学欺负,老师训斥也不管用。同事气不过,又不能和小孩一般见识,晚上怒气冲冲对他儿子说“你明天上学不把他(欺负他的同学)揍一顿,回来你就要挨打,若是打赢了晚上回来还有奖励。”第二天他儿子一入园就找那小子报仇去了,还把他打的流鼻血。老师问为什么打架,他儿子理直气壮的说“不打他晚上回去我爸要打我的。”搞的老师有点哭笑不得。同事被请去学校,在办公室老师当着好几个老师的面讲给他听,同事说当时真觉得丢人,过后又觉得很赞。当晚同事就带他儿子肯德基去了,还奖励了20。之后再也没…查看全文')
('/users/28264578/', '屌丝小叔', '我想说在群里抢红包说少的发,抢了个最少的0.53元,到我发时想发个5.3元手一抖53元没了糗吧!这还不是经典,经典的刚洗澡时把洗面膏当洗发膏用了,半天不起沫才发现用错了!唉')
('/users/19216493/', 'CTR小诺', '小仙女请发言      过麦')
('/users/9942197/', '植哥哥', '太单纯,怪我不懂……')
('/users/27749688/', '无言,无缘', '两手抓咪咪')
('/users/33390668/', '吃土吃够了', '我爸要给我买火箭了,再过两天就是我27岁的生日了,我跟我爸说想出去玩,让他给我买张机票当礼物,我爸说∶“我给你买个火箭你直接上天,免得老嫁不出去呆在地球上丢人!”我∶x01[捂脸]x01[捂脸]……')
('/users/26260464/', '紫燕双飞飞飞的', '好像很拉风。')

 这部分怎么提取呢?通过正则表达式匹配。怎么写这个正则表达式呢?这里用到一个简单粗暴的方法:

1、视频分类
2、资源名称
3、资源链接
4、资源大小
5、上传时间

代码解读

  • import: 关键字,是导入python库文件的,当然也可以导入你自己写得文件,它的意思是要引用哪个模块,这里我们需要引用两个模块,一个是urllib模块,一个是re(正则表达式模块),引用了这两个模块后我们就能使用这两个模块提供的方法

  • url:澳门新萄京官方网站, 变量,这里的变量赋值为糗事百科的网址

  • user_agent: 用户代理,这个参数很关键,爬虫所有的动作都需要模拟人怎么去操作,这样服务器才不会拦截你的访问,user_agent表示我们使用的是什么浏览器去访问的,这里需要说明一下反爬策略,常见的反爬策略是服务器端会监测你的user_agent,ip, 访问频率,如果你同一个ip地址短时间内访问过多,服务器端会认为你不是人为操作,它会认为你是个机器人,因为人为操作没有这么频繁。所以爬和反爬是一对天敌,后面我会讲爬虫的高级应用,所谓“道高一尺,魔高一丈”是也。user_agent参数可以通过开发者工具Network菜单下的Headers查看

    澳门新萄京官方网站 25

    4-9 user_agent参数查看

  • Request(...):该函数是创建一个请求实例,我们可以看看开发文档的描述

    澳门新萄京官方网站 26

    4-10 python3开发文档urllib.request模块定义

  • urlopen(...): 打开一个url,该函数的定义如下
    urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
    url参数可以是一个字符串也可以是一个Request对象,更多的介绍可以查看开发文档

  • read(): 读取页面返回的内容。

  • decode():解码,我们读取回来的内容是经过编码后的字符串,如果不解码就看不明白都会来的字符串,如何查看页面是什么编码呢?我们可以通过开发者工具查看,也可以通过查看页面源代码查看网页编码。

    澳门新萄京官方网站 27

    4-11 页面编码查看

  • compile(): 编译正则表达式模块,这个函数将返回一个匹配模式对象,这里推荐大家写正则表达式的时候先把正则表达式预编译成一个对象,这样在查找的时候程序就不需要每次都再去编译一次正则表达式了,特别是对于在海量文本中查找的时候预编译正则规则尤为重要,预编译正则规则能提高你的代码执行效率
    findall,sub等函数上一篇聚沙成塔--爬虫系列(三)(正则表达式)文章已经介绍过了,这里不在累诉。

note: 这里我们用到了前面章节介绍到的python的两种数据结果,列表和元组,还有for循环语法,函数findall返回的是一个list(列表),所以我们需要循环列表里的每个元素,每个元素代表一个被匹配上的用户信息,正则表达式中用()括号括起来的表示你要取的元素,它将会以元组的形式方法。到这里我们就完成了一个最基本的爬虫程序了,你是不是可以收集海量段子了,时不时的给妹子发个段子,是不是可以在妹子面前展示一下你的幽默诙谐了,哈哈。。。。,骚年这还不够,继续努力吧。。。。

更多的文章可以关注我的blog:http://www.gavinxyj.com


<a href="ftp(.*?)">ftp

就这么多就够了,如果有需要,还可以增加。

欢迎关注我的公众号:爱做饭的老谢,老谢一直在努力...

爬虫中经常用到.*?来做非贪婪匹配(专业名词请百度),你可以简单认为这个(.*?)就代表你想要爬取出来的东西,这样的东西在每个网页源码中都是夹在<a href="ftp和">ftp之间的。有人可能会问,那这个匹配出来的不是网址啊,比如上图中出来的就是://d:d@dygodj8.com:12311/[电影天堂www.dy2018.com]请以你的名字呼唤我BD中英双字.mp4,前面少了个ftp啊?

首先提取一段tr标签里的代码来观察一下。

是的,不过这是故意为之,如果正则表达式写成<a href="(.*?)">ftp,可能夹在<a href="和">ftp之间的东西就太多了,二次处理的成本还不如先用你觉得最快最直接的方式抽取有用信息,然后再进行拼接来得快。

 <tr>
  <td class="vertTh">
   <center>
    <a href="/browse/200" title="此目录中更多">视频</a><br />
    (<a href="/browse/205" title="此目录中更多">电视</a>)
   </center>
  </td>
  <td>
<div class="detName">   <a href="/torrent/7782194/The_Walking_Dead_Season_3_Episodes_1-3_HDTV-x264" class="detLink" title="细节 The Walking Dead Season 3 Episodes 1-3 HDTV-x264">The Walking Dead Season 3 Episodes 1-3 HDTV-x264</a>
</div>
<a href="magnet:?xt=urn:btih:4f63d58e51c1a4a997c6f099b2b529bdbba72741&dn=The Walking Dead Season 3 Episodes 1-3 HDTV-x264&tr=udp://tracker.openbittorrent.com:80&tr=udp://tracker.publicbt.com:80&tr=udp://tracker.istole.it:6969&tr=udp://tracker.ccc.de:80" title="Download this torrent using magnet"><img src="//static.某piratebay.se/img/icon-magnet.gif" alt="Magnet link" /></a>   <a href="//torrents.某piratebay.se/7782194/The_Walking_Dead_Season_3_Episodes_1-3_HDTV-x264.7782194.TPB.torrent" title="下载种子"><img src="//static.某piratebay.se/img/dl.gif" class="dl" alt="下载" /></a><img src="//static.某piratebay.se/img/11x11p.png" /><img src="//static.某piratebay.se/img/11x11p.png" />
   <font class="detDesc">已上传 <b>3 分钟前</b>, 大小 2 GiB, 上传者 <a class="detDesc" href="/user/paridha/" title="浏览 paridha">paridha</a></font>
  </td>
  <td align="right">0</td>
  <td align="right">0</td>
 </tr>
 为何要用正则表达式而不用其他一些解析HTML或者DOM树的工具是有原因的。我之前试过用BeautifulSoup3来提取内容,后来发觉速度实在是慢死了啊,一秒钟能够处理100个内容,已经是我电脑的极限了。。。而换了正则表达式,编译后处理内容,速度上直接把它秒杀了!

 

提取这么多内容,我的正则表达式要如何写呢?

代码详解:

根据我以往的经验,“.*?”或者“. ?”这个东西是很好使的。 不过也要注意一些小问题,实际用到的时候就会知道

一、getdownurl

对于上面的tr标签代码,我首先需要让我的表达式匹配到的符号是

#getdownurl获取页面的视频地址
def getdownurl(url):
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'}
    req = requests.get(url , headers = headers)
    req.encoding = 'gbk'#指定编码,否则会乱码
    pat = re.compile('<a href="ftp(.*?)">ftp',re.S)#获取下载地址
    reslist = re.findall(pat, req.text)
    furl = 'ftp' reslist[0]
    return furl

<tr>

其中headers是用来将你的脚本访问网址伪装成浏览器访问,以防有些网站进行了反爬虫的措施。这个headers在很多浏览器中也可以很容易得到,以Firefox为例,直接F12或查看元素,在网络标签,右侧的消息头中右下角即可看到。

表示内容的开始,当然也可以是别的,只要不要错过需要的内容即可。然后我要匹配的内容是下面这个,获取视频分类。

澳门新萄京官方网站 28

(<a href="/browse/205" title="此目录中更多">电视</a>)

requests模块:requests.get(url , headers = headers)是用伪装成firefox的形式获取该网页的信息。
re模块:可以参考python正则表达式的一些东西,这里用re.complile来写出匹配的模式,re.findall根据模式在网页源代码中找到相应的东西。
二、pagelink

#pagelink用来产生页面内的视频链接页面
def pagelink(url):
    base_url = 'https://www.dygod.net/html/gndy/jddy/'
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'}
    req = requests.get(url , headers = headers)
    req.encoding = 'gbk'#指定编码,否则会乱码
    pat = re.compile('<a href="/html/gndy/jddy/(.*?)" class="ulink" title=(.*?)/a>',re.S)#获取电影列表网址
    reslist = re.findall(pat, req.text)

    finalurl = []
    for i in range(1,25):
        xurl = reslist[i][0]
        finalurl.append(base_url   xurl)
    return finalurl #返回该页面内所有的视频网页地址

接着我要匹配资源链接了,

第一步getdownurl是用于爬取一个网页的网址,这一步用于获取同一页面内所有网页的网址,像下面的网页包含很多电影链接

<a href="..." class="detLink" title="...">...</a>

澳门新萄京官方网站 29

再到其他资源信息,

源码是这样的:

font class="detDesc">已上传 <b>3 分钟前</b>, 大小 2 GiB, 上传者

澳门新萄京官方网站 30

最后匹配

聪明的你一看就知道需要哪些信息,这个页面正文有25个电影链接,我这里用到一个list来存放这些网址,其实range(1,25)不包含25,也就是说我只存放了24个网址,原因是我的正则表达式写的不好,爬出来的第一个网址有问题,如果有兴趣可以研究下怎么完善。

</tr>

需要一提的是这个正则表达式用到了两处.*?,所以匹配到的reslist是二维的。

大功告成!

三、changepage

当然,最后的匹配可以不需要在正则表达式里表示出来,只要开始位置定位正确了,后面获取信息的位置也就正确了。

#changepage用来产生不同页数的链接
def changepage(url,total_page):
    page_group = ['https://www.dygod.net/html/gndy/jddy/index.html']
    for i in range(2,total_page 1):
        link = re.sub('jddy/index','jddy/index_' str(i),url,re.S)
        page_group.append(link)
    return page_group

对正则表达式比较了解的朋友,可能知道怎么写了。我Show一下我写的表达式处理过程,

这里也比较简单,点击下一页,抬头看看网址栏的网址是什么,这里是index/index_2/index_3...很容易拼接

 澳门新萄京官方网站 31

澳门新萄京官方网站 32

就这么简单,结果出来了,自我感觉挺欢喜的。

四、main

当然,这样设计的爬虫是有针对性的,定向爬取某一个站点的内容。 也没有任何一个爬虫不会对收集到的链接进行筛选。通常可以使用BFS(宽度优先搜索算法)来爬取一个网站的所有页面链接。

if __name__ == "__main__" :
    html = "https://www.dygod.net/html/gndy/jddy/index.html"
    print('你即将爬取的网站是:https://www.dygod.net/html/gndy/jddy/index.html')
    pages = input('请输入需要爬取的页数:')
    p1 = changepage(html,int(pages))
    with open ('电影天堂下载地址.lst','w') as f :
        j = 0
        for p1i in p1 :
            j = j   1
            print('正在爬取第%d页,网址是 %s ...'%(j,p1i))
            p2 = pagelink(p1i)
            for p2i in p2 :
                p3 = getdownurl(p2i)
                if len(p3) == 0 :
                    pass
                else :
                    finalurl = p3
                    f.write(finalurl   'n')
    print('所有页面地址爬取完毕!')

完整的Python爬虫代码,爬取某湾最新的10页视频资源:

main里面几乎没什么好说的,反正就是循环读取,再往文件里写进行了。

# coding: utf8
import urllib2
import re
import pymongo

五、运行及结果

db = pymongo.Connection().test
url = ''
find_re = re.compile(r'<tr>. ?(. ?">(. ?)</a>. ?class="detLink". ?">(. ?)</a>. ?<a href="(magnet:. ?)" . ?已上传 <b>(. ?)</b>, 大小 (. ?),', re.DOTALL)

澳门新萄京官方网站 33

# 定向爬去10页最新的视频资源
for i in range(0, 10):
    u = url % (i)
    # 下载数据
    html = urllib2.urlopen(u).read()
    # 找到资源信息
    for x in find_re.findall(html):
        values = dict(
            category = x[0],
            name = x[1],
            magnet = x[2],
            time = x[3],
            size = x[4]
        )
        # 保存到数据库
        db.priate.save(values)

澳门新萄京官方网站 34

print 'Done!'
以上代码仅供思路展示,实际运行使用到mongodb数据库,同时可能因为无法访问某湾网站而无法得到正常结果。

然后迅雷就可以直接导入了。(后缀为downlist或lst迅雷可以直接导入)

所以说,电影来了网站用到的爬虫不难写,难的是获得数据后如何整理获取有用信息。例如,如何匹配一个影片信息跟一个资源,如何在影片信息库和视频链接之间建立关联,这些都需要不断尝试各种方法,最后选出比较靠谱的。

后记:有些可能会觉得这样一股脑的把电影都下载下来,可能有些电影太烂,下载下来就是浪费时间和资源,而手工筛选又太费事,后续会通过数据库的方式来存储影片的信息,从而筛选出需要的地址。

曾有某同学发邮件想花钱也要得到我的爬虫的源代码。
要是我真的给了,我的爬虫就几百来行代码,一张A4纸,他不会说,坑爹啊!!!……

 

都说现在是信息爆炸的时代,所以比的还是谁的数据挖掘能力强

Python一直是我主要使用的脚本语言,没有之一。Python的语言简洁灵活,标准库功能强大,平常可以用作计算器,...

本文由澳门新萄京官方网站发布于www.8455.com,转载请注明出处:澳门新萄京官方网站:使用Python编写简单网络爬

关键词: