如何用 Python 爬取社交网络爬取

使用python/casperjs编写终极爬虫-客户端App的抓取 - Python - 伯乐在线
& 使用python/casperjs编写终极爬虫-客户端App的抓取
随着移动互联网的发展,现在写web和我三年前刚开始写爬虫的时候已经改变了太多。特别是在node以及javascript/ruby社区的努力下,以往“服务器端”做的事情都慢慢搬到了“浏览器”来实现,最极端的例子可能是了 ,写web程序无需划分前端后端的时代已经到来了。。。
在这一方面,Google一向是最激进的。纵观Google目前的产品线,社交的Google Plus,网站分析的Google Analytics,Google目前赖以生存的Google Adwords等,如果想下载源码,用ElementTree来解析网页,那什么都得不到,因为Google的数据都是通过Ajax调用经过数据混淆处理的数据,然后用JavaScript进行解析渲染到页面上的。
本来这种事情也不算太多,忍一忍就行了,不过最近因业务需要,经常需要上Google的Keyword Tools来分析特定关键字的搜索量。
图为关键字搜索的截图
图为Google经过混淆处理的Ajax返回结果。
要把这么费劲的事情自动化倒也不难,因为Google也提供了API来做,Adwords项目的就是来做这个的,问题是Google的API调用需要花钱,而如果能用爬虫技术来爬取这个结果,就能省去不必要的额外开销。
2. Selenium WebDriver
由于要解析执行复杂的JavaScript,必须有一个Full Stack的浏览器JavaScript环境,这种环境三年前的话,可能只能诉诸于于,selenium是一款多语言的浏览器Driver,它最大的优点在于,提供了从命令行统一操控多种不同浏览器的方法,这极大地方便了web产品的兼容性自动化测试。
2.1 在没有图形界面的服务器上安装和使用Selenium
安装selenium非常简单,pip install selenium 即可,但是要让firefox/chrome工作,没有图形界面的话,还是要费一番功夫的。
推荐的做法是
apt-get install xvfb
Xvfb :99 -ac -screen 0 &
export DISPLAY=:99
apt-get install xvfbXvfb :99 -ac -screen 0 &export DISPLAY=:99
Selenium的安装和配置在此就不多说了,值得注意的是,如果是Ubuntu用户,并且要使用Chrome的话,必须额外下载一个chromedriver,并且把安装的chromium-browser链接到/usr/bin/google-chrome,否则将无法运行。
2.2 爬取Keywords
先总结一下Adwords的使用方法吧,要能正常使用Adwords,必须要有一个开通Adwords的Google Account,这倒不是很难,只要访问
,Google会协助创建账号,如果还没有的话,其次就是登陆了。
通过分析登陆页面,我们可以看到需要在id为Email的一个input框内输入email,然后在id为Passwd的密码框内输入密码,然后点击Sign in提交这个页面内唯一的form。
首先别忘了开一个浏览器先
search = re.compile(r'(\?[^#]*)#').search(driver.current_url).group(1)
kwurl='/o/Targeting/Explorer'+search+'&__o=cues&ideaRequestType=KEYWORD_IDEAS'
<div class="crayon-num" data-line="crayon-599f8b<div class="crayon-num crayon-striped-num" data-line="crayon-599f8b
search = re.compile(r'(\?[^#]*)#').search(driver.current_url).group(1)kwurl='/o/Targeting/Explorer'+search+'&__o=cues&ideaRequestType=KEYWORD_IDEAS'
driver.find_element_by_id("Email").send_keys(email)
driver.find_element_by_id("Passwd").send_keys(passwd)
driver.find_element_by_id('signIn').submit()
driver.find_element_by_id("Email").send_keys(email)driver.find_element_by_id("Passwd").send_keys(passwd)driver.find_element_by_id('signIn').submit()
登陆后,我们发现需要访问一个类似 /o/Targeting/Explorer 的网页才能跳转到关键字工具,于是我们手动生成一下这个网页
search = re.compile(r'(\?[^#]*)#').search(driver.current_url).group(1)
kwurl='/o/Targeting/Explorer'+search+'&__o=cues&ideaRequestType=KEYWORD_IDEAS'
<div class="crayon-num" data-line="crayon-599f8b<div class="crayon-num crayon-striped-num" data-line="crayon-599f8b
search = re.compile(r'(\?[^#]*)#').search(driver.current_url).group(1)kwurl='/o/Targeting/Explorer'+search+'&__o=cues&ideaRequestType=KEYWORD_IDEAS'
到了工具主页以后,事情就变得Tricky起来了。因为整个关键字工具都是个客户端App,在全部文件载入完成以后,页面不会直接渲染完毕,而是要经过复杂的JavaScript运算后页面才会完整显示。然而Selenium WebDriver并不知道这一点,所以我们要让他知道。
在这里,我们要等待Search按钮在浏览器中出现以后,才能确认网页加载完毕,Selenium WebDriver有两种方式可以实现这一点,我偷懒用了全局的默认等待机制:
driver.implicitly_wait(30)
<div class="crayon-num" data-line="crayon-599f8b
driver.implicitly_wait(30)
于是Selenium就会在找不到页面元素的时候自动等候不超过30秒
接下来,等待输入框和Search按钮出现后提交搜索iphone关键字的请求
driver.find_element_by_class_name("sEAB").send_keys("iphone")
find_element_by_css_selector("button.gwt-Button").click()
<div class="crayon-num" data-line="crayon-599f8b<div class="crayon-num crayon-striped-num" data-line="crayon-599f8b
driver.find_element_by_class_name("sEAB").send_keys("iphone")find_element_by_css_selector("button.gwt-Button").click()
然后我们继续等待class为sLNB的table的出现,并解析结果
result = {}
texts = driver.find_elements_by_xpath('//table[@class="sLNB"]')\
[0].text.split()
for i in range(1, len(texts)/4):
result[ texts[i*4] ] = (texts[i*4+2], texts[i*4+3])
result = {}texts = driver.find_elements_by_xpath('//table[@class="sLNB"]')\&&&&&&&&&&&&[0].text.split()for i in range(1, len(texts)/4):&&&&result[ texts[i*4] ] = (texts[i*4+2], texts[i*4+3])
这里我们使用了xpath来提取网页特征,这也算是写爬虫的必备吧。
完整的例子见:
替换email和passwd后直接就能用了
3. JavaScript Headless解决方案
随着Node以及随之而来的JavaScript社区的进化,如今的我们就幸福多了。远的我们有phantomjs, 一个Headless的WebKit Driver,意味着可以无需GUI,完全模拟Chrome/Safari的操作。 近的有casperjs(基于phantomjs的好用封装),zombie(相比phantomjs的优势是可以和node集成)等。
其中非常可惜地是,zombiejs似乎对富JavaScript网站支持得有问题,所以后来我还是只能用casperjs来进行测试。Headless的方案因为不需要渲染GUI,执行速度约为Selenium方案的三倍。
另外由于这是纯JavaScript的方案,于是我们可以直接在例如Chrome的Console模式下写代码控制浏览器,不存在如Selenium那样还需要语义转换,非常简洁直观。例如利用W3C Selectors API Level 1所提供的querySelector来快速选取元素,对表单进行submit,对按钮进行click,甚至可以执行自定义JavaScript脚本以便按一定规律对页面进行操控。
但是casperjs或者说phantomjs的弱点是不支持除了文件读写和浏览器操作以外的一切*nix IPC惯用伎俩,socket神马的统统不支持,1.4版本以后才加入了一个webserver用于和外界通信,但是用httpserver来和外界通信?我有点抵触就是了。
废话不说了,casperjs的代码看起来就是这样,登陆:
var casper = require('casper').create({verbose:true,logLevel:"debug"});
casper.start('');
casper.thenEvaluate(function login(email, passwd) {
document.querySelector('#Email').setAttribute('value', email);
document.querySelector('#Passwd').setAttribute('value', passwd);
document.querySelector('form').submit();
}, {email:email, passwd:passwd});
casper.waitForSelector(".aw-cues-item", function() {
kwurl = this.evaluate(function(){
var search = document.location.
return '/o/Targeting/Explorer'+search+'&__o=cues&ideaRequestType=KEYWORD_IDEAS';
<div class="crayon-num" data-line="crayon-599f8b<div class="crayon-num crayon-striped-num" data-line="crayon-599f8b<div class="crayon-num" data-line="crayon-599f8b<div class="crayon-num crayon-striped-num" data-line="crayon-599f8b<div class="crayon-num" data-line="crayon-599f8b<div class="crayon-num crayon-striped-num" data-line="crayon-599f8b<div class="crayon-num" data-line="crayon-599f8b<div class="crayon-num crayon-striped-num" data-line="crayon-599f8b<div class="crayon-num" data-line="crayon-599f8b<div class="crayon-num crayon-striped-num" data-line="crayon-599f8b<div class="crayon-num" data-line="crayon-599f8b<div class="crayon-num crayon-striped-num" data-line="crayon-599f8b<div class="crayon-num" data-line="crayon-599f8b<div class="crayon-num crayon-striped-num" data-line="crayon-599f8b<div class="crayon-num" data-line="crayon-599f8b<div class="crayon-num crayon-striped-num" data-line="crayon-599f8b
var casper = require('casper').create({verbose:true,logLevel:"debug"});&casper.start('');&casper.thenEvaluate(function login(email, passwd) {document.querySelector('#Email').setAttribute('value', email);document.querySelector('#Passwd').setAttribute('value', passwd);document.querySelector('form').submit();}, {email:email, passwd:passwd});&casper.waitForSelector(".aw-cues-item", function() {kwurl = this.evaluate(function(){var search = document.location.search;return '/o/Targeting/Explorer'+search+'&__o=cues&ideaRequestType=KEYWORD_IDEAS';})});
与Selenium类似,因为页面都是Ajax调用的,我们需要明确地“等待某个元素出现”,即:waitForSelector,casperjs的文档既简洁又漂亮,不妨多逛逛。
值得一提的是,casperjs一定要调用casper.run方法,之前的start, then等方法,只是把步骤封装到了this._steps里面,只有在run的时候才会真正执行,所以casperjs设计流程的时候会很痛苦,for/each之类的手法有时并不好用。
这个时候需要用JavaScript编程比较常用的递归化的方法,参见/n1k0/casperjs/blob/master/samples/dynamic.js 这个例子。我在完整的casperjs代码里面也是这么做的。
具体逻辑的实现和selenium类似,我就不废话了,完整的例子参见:
介绍了selenium和casperjs两种不同的终极爬虫写法,但是其实这篇文写来只是太久没更新了,写点东西更新一下而已:)
可能感兴趣的话题
o 247 回复
关于 Python 频道
Python频道分享 Python 开发技术、相关的行业动态。
新浪微博:
推荐微信号
(加好友请注明来意)
&#8211; 好的话题、有启发的回复、值得信赖的圈子
&#8211; 分享和发现有价值的内容与观点
&#8211; 为IT单身男女服务的征婚传播平台
&#8211; 优秀的工具资源导航
&#8211; 翻译传播优秀的外文文章
&#8211; 国内外的精选文章
&#8211; UI,网页,交互和用户体验
&#8211; 专注iOS技术分享
&#8211; 专注Android技术分享
&#8211; JavaScript, HTML5, CSS
&#8211; 专注Java技术分享
&#8211; 专注Python技术分享
& 2017 伯乐在线利用Python抓取和解析网页(转载)
这是我写爬虫的时候搜到的一篇比较不错的文章
讲的还是比较详细 虽然代码有部分缩进错误 稍微修改下就可以有很好的效果了 于是我就脸皮厚的贴了过来 收藏吧算是
对搜索引擎、文件索引、文档转换、数据检索、站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理。事实上,通过Python语言提供的各种模块,我们无需借助Web服务器或者Web浏览器就能够解析和处理HTML文档。本文上篇中,我们介绍了一个可以帮助简化打开位于本地和Web上的HTML文档的Python模块。在本文中,我们将论述如何使用Python模块来迅速解析在HTML文件中的数据,从而处理特定的内容,如链接、图像和Cookie等。同时还会介绍如何规范HTML文件的格式标签。
  一、(1)从HTML文档中提取链接
  Python语言还有一个非常有用的模块HTMLParser,该模块使我们能够根据HTML文档中的标签来简洁、高效地解析HTML文档。所以,在处理HTML文档的时候,HTMLParser是最常用的模块之一。
import HTMLParser
import urllib
import sys
parseLinks(HTMLParser.HTMLParser):
def handle_starttag(self,
tag, attrs):
if tag == 'a':
for name,value in
if name == 'href':
print value
self.get_starttag_text()
parseLinks()
lParser.feed(urllib.urlopen(url).read())
& & (2)从网页中提取文本
import HTMLParser
import urllib
import sys
urlText = []
class parseText(HTMLParser.HTMLParser):
def handle_data(self, data):
if data != '\n':
urlText.append(data)
lParser = parseText()
lParser.feed(urllib.urlopen(url).read())
lParser.close()
fp = open("/home/zhou/web text.txt","w")
for item in urlText:
print item
fp.write(item)
fp.close()
(3)将网页保存下来
urlText = urllib.urlopen(url)
content = urlText.read()
fp = open("/home/zhou/web.html","w")
fp.write(content)
fp.close()
 二、从HTML文档中提取图像
  处理HTML文档的时候,我们常常需要从其中提取出所有的图像。使用HTMLParser模块后,这项任务将变得易如反掌。首先,我们需要定义一个新的HTMLParser类,以覆盖handle_starttag()方法,该方法的作用是查找img标签,并保存src属性值所指的文件。
  import&HTMLParser
  import&urllib
  def&getImage(addr):
  u&=&urllib.urlopen(addr)
  data&=&u.read()
  class&parseImages(HTMLParser.HTMLParser):
  def&handle_starttag(self,
tag, attrs):
  if&tag&==&'img':
  for&name,value&in&attrs:
  if&name&==&'src':
  getImage(urlString&+&"/"&+&value)
  u&=&urllib.urlopen(urlString)
  lParser.feed(u.read())
  定义好新的HTMLParser类之后,需要创建一个实例来返回HTMLParser对象。然后,就可以使用urllib.urlopen(url)打开HTML文档并读取该HTML文件的内容了。
  为了解析HTML文件的内容并显示包含其中的图像,可以使用feed(data)函数将数据发送至HTMLParser对象。HTMLParser对象的feed函数将接收数据,并通过定义的HTMLParser对象对数据进行相应的解析。下面是一个具体的示例:
  import&HTMLParser
  import&urllib
  import&sys
  urlString&=&"http://www.python.org"
  #把图像文件保存至硬盘
  def&getImage(addr):
  u&=&urllib.urlopen(addr)
  data&=&u.read()
  splitPath&=&addr.split('/')
  fName&=&splitPath.pop()
  print&"Saving
%s"&%&fName
  f&=&open(fName,&'wb')
  f.write(data)
  f.close()
  #定义HTML解析器
  class&parseImages(HTMLParser.HTMLParser):
  def&handle_starttag(self,
tag, attrs):
  if&tag&==&'img':
  for&name,value&in&attrs:
  if&name&==&'src':
  getImage(urlString&+&"/"&+&value)
  #创建HTML解析器的实例
  lParser&=&parseImages()
  #打开HTML文件
  u&=&urllib.urlopen(urlString)
  print&"Opening
URL\n===================="
  print&<()
  #把HTML文件传给解析器
  lParser.feed(u.read())
  lParser.close()
  上述代码的运行结果如下所示:
  Opening URL
  ====================
  Date: Fri,&26&Jun&2009&10:54:49&GMT
  Server: Apache/2.2.9&(Debian)
DAV/2&SVN/1.5.1&mod_ssl/2.2.9&OpenSSL/0.9.8g
mod_wsgi/2.3&Python/2.5.2
  Last-Modified:
Thu,&25&Jun&2009&09:44:54&GMT
  ETag:&"e7-46d"
  Accept-Ranges: bytes
  Content-Length:&18151
  Connection: close
  Content-Type: text/html
  Saving python-logo.gif
  Saving trans.gif
  Saving trans.gif
  Saving afnic.fr.png
& 三、从HTML文档中提取文本
  处理HTML文档的时候,我们常常需要从其中提取出所有的文本。使用HTMLParser模块后,这项任务将变得非常简单了。首先,我们需要定义一个新的HTMLParser类,以覆盖handle_data()方法,该方法是用来解析并文本数据的。
  import&HTMLParser
  import&urllib
  class&parseText(HTMLParser.HTMLParser):
  def&handle_data(self,
  if&data&!=&'\n':
  urlText.append(data)
  lParser&=&parseText()
  lParser.feed(urllib.urlopen( \
  http://docs.python.org/lib/module-HTMLParser.html).read())
  定义好新的HTMLParser类之后,需要创建一个实例来返回HTMLParser对象。然后,就可以使用urllib.urlopen(url)打开HTML文档并读取该HTML文件的内容了。
  为了解析HTML文件的内容并显示包含其中的文本,我们可以使用feed(data)函数将数据传递给HTMLParser对象。HTMLParser对象的feed函数将接收数据,并通过定义的HTMLParser对象对数据进行相应的解析。要注意的是,如果传给HTMLParser的feed()函数的数据不完整的话,那么不完整的标签会保存下来,并在下一次调用feed()函数时进行解析。当HTML文件很大,需要分段发送给解析器的时候,这个功能就会有用武之地了。下面是一个具体的代码示例:
  import&HTMLParser
  import&urllib
  urlText&=&[]
  #定义HTML解析器
  class&parseText(HTMLParser.HTMLParser):
  def&handle_data(self,
  if&data&!=&'\n':
  urlText.append(data)
  #创建HTML解析器的实例
  lParser&=&parseText()
  #把HTML文件传给解析器
  lParser.feed(urllib.urlopen( \
  “http://docs.python.org/lib/module-HTMLParser.html” \
  ).read())
  lParser.close()
  for&item&in&urlText:
  print&item
  上面代码的运行输出过长,在此略过
四、从HTML文档中提取Cookies
  很多时候,我们都需要处理Cookie,幸运的是Python语言的cookielib模块为我们提供了许多自动处理在HTML中的HTTP
Cookie的类。当处理要求为客户端设置Cookie的HTML文档的时候,这些类对我们非常有用。
  import&urllib2
  import&cookielib
  from&urllib2&import&urlopen,
  cJar&=&cookielib.LWPCookieJar()
  opener=urllib2.build_opener( \
  urllib2.HTTPCookieProcessor(cJar))
  urllib2.install_opener(opener)
  r&=&Request(testURL)
  h&=&urlopen(r)
  for&ind,
cookie&in&enumerate(cJar):
  print&"%d
- %s"&%&(ind,
  cJar.save(cookieFile)
  为了从HTML文档提取cookies,首先得使用cookielib模块的LWPCookieJar()函数创建一个cookie
jar的实例。LWPCookieJar()函数将返回一个对象,该对象可以从硬盘加载Cookie,同时还能向硬盘存放Cookie。
  接下来,使用urllib2模块的build_opener([handler, . .
.])函数创建一个opener对象,当HTML文件打开时该对象将处理cookies。函数build_opener可以接收零个或多个处理程序(这些程序将按照它们被指定的顺序连接在一起)作为参数并返回一个。
  注意,如果想让urlopen()使用opener对象来打开HTML文件的话,可以调用install_opener(opener)函数,并将opener对象传给它。否则,请使用opener对象的open(url)函数来打开HTML文件。
  一旦已经创建并安装了opener对象,就可以使用urllib2模块中的Request(url)函数来创建一个Request对象,然后就能使用urlopen(Request)函数来打开HTML文件了。
  打开HTML页面后,该页面的所有Cookie将被存放到LWPCookieJar对象中,之后,您可以使用LWPCookieJar对象的save(filename)函数了。
  import&os
  import&urllib2
  import&cookielib
  from&urllib2&import&urlopen,
  cookieFile&=&"cookies.dat"
  testURL&=&'/'
  #为cookie
jar 创建实例
  cJar&=&cookielib.LWPCookieJar()
  #创建HTTPCookieProcessor的opener对象
  opener&=&urllib2.build_opener(
  urllib2.HTTPCookieProcessor(cJar))
  #安装HTTPCookieProcessor的opener
  urllib2.install_opener(opener)
  #创建一个Request对象
  r&=&Request(testURL)
  #打开HTML文件
  h&=&urlopen(r)
  print&"页面的头部\n======================"
  print&<()
  print&"页面的Cookies\n======================"
  for&ind,
cookie&in&enumerate(cJar):
  print&"%d
- %s"&%&(ind,
  #保存cookies
  cJar.save(cookieFile)
  上述代码的运行结果如下所示:
  页面的头部
  ======================
  Cache-Control: private
  Content-Type: text/ charset=ISO-8859-1
  Set-Cookie: PREF=ID=5d733:NW=1:TM=:LM=:S=frfx--b3xt73TaEA; expires=Sun,&26-Jun-2011&11:26:48&GMT;
path=/; domain=.
  Date: Fri,&26&Jun&2009&11:26:48&GMT
  Server: mfe
  Expires: Fri,&26&Jun&2009&11:26:48&GMT
  Transfer-Encoding: chunked
  Connection: close
  页面的Cookies
  ======================
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。使用Python编写简单网络爬虫抓取视频下载资源
投稿:hebedich
字体:[ ] 类型:转载 时间:
从上一篇文章的评论中看出似乎很多童鞋都比较关注爬虫的源代码。所有本文就使用Python编写简单网络爬虫抓取视频下载资源做了很详细的记录,几乎每一步都介绍给大家,希望对大家能有所帮助
我第一次接触爬虫这东西是在今年的5月份,当时写了一个博客搜索引擎,所用到的爬虫也挺智能的,起码比电影来了这个站用到的爬虫水平高多了!
回到用Python写爬虫的话题。
Python一直是我主要使用的脚本语言,没有之一。Python的语言简洁灵活,标准库功能强大,平常可以用作计算器,文本编码转换,图片处理,批量下载,批量处理文本等。总之我很喜欢,也越用越上手,这么好用的一个工具,一般人我不告诉他。。。
因为其强大的字符串处理能力,以及urllib2,cookielib,re,threading这些模块的存在,用Python来写爬虫就简直易于反掌了。简单到什么程度呢。我当时跟某同学说,我写电影来了用到的几个爬虫以及数据整理的一堆零零散散的脚本代码行数总共不超过1000行,写电影来了这个网站也只有150来行代码。因为爬虫的代码在另外一台64位的黑苹果上,所以就不列出来,只列一下VPS上网站的代码,tornadoweb框架写的
[xiaoxia@307232 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一下爬虫的编写流程。以下内容仅供交流学习使用,没有别的意思。
以某湾的最新视频下载资源为例,其网址是
http://某piratebay.se/browse/200
因为该网页里有大量广告,只贴一下正文部分内容:
对于一个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标签。
而对于每一个资源,需要提取的信息有:
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:&#63;xt=urn:btih:4f63d58e51c1a4a997c6f099b2b529bdbba72741&dn=The+Walking+Dead+Season+3+Episodes+1-3+HDTV-x264&tr=udp%3A%2F%%3A80&tr=udp%3A%2F%%3A80&tr=udp%3A%2F%2Ftracker.istole.it%3A6969&tr=udp%3A%2F%2Ftracker.ccc.de%3A80" 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代码中的内容。对正则表达式不了解的同学,可以去 http://docs.python.org/2/library/re.html 了解一下。
为何要用正则表达式而不用其他一些解析HTML或者DOM树的工具是有原因的。我之前试过用BeautifulSoup3来提取内容,后来发觉速度实在是慢死了啊,一秒钟能够处理100个内容,已经是我电脑的极限了。。。而换了正则表达式,编译后处理内容,速度上直接把它秒杀了!
提取这么多内容,我的正则表达式要如何写呢?
根据我以往的经验,“.*&#63;”或者“.+&#63;”这个东西是很好使的。不过也要注意一些小问题,实际用到的时候就会知道
对于上面的tr标签代码,我首先需要让我的表达式匹配到的符号是
表示内容的开始,当然也可以是别的,只要不要错过需要的内容即可。然后我要匹配的内容是下面这个,获取视频分类。
(&a href="/browse/205" title="此目录中更多"&电视&/a&)
接着我要匹配资源链接了,
&a href="..." class="detLink" title="..."&...&/a&
再到其他资源信息,
font class="detDesc"&已上传 &b&3&分钟前&/b&, 大小 2&GiB, 上传者
大功告成!
当然,最后的匹配可以不需要在正则表达式里表示出来,只要开始位置定位正确了,后面获取信息的位置也就正确了。
对正则表达式比较了解的朋友,可能知道怎么写了。我Show一下我写的表达式处理过程,
就这么简单,结果出来了,自我感觉挺欢喜的。
当然,这样设计的爬虫是有针对性的,定向爬取某一个站点的内容。也没有任何一个爬虫不会对收集到的链接进行筛选。通常可以使用BFS(宽度优先搜索算法)来爬取一个网站的所有页面链接。
完整的Python爬虫代码,爬取某湾最新的10页视频资源:
# coding: utf8import urllib2import reimport pymongodb = pymongo.Connection().testurl = 'http://某piratebay.se/browse/200/%d/3'find_re = re.compile(r'&tr&.+&#63;\(.+&#63;"&(.+&#63;)&/a&.+&#63;class="detLink".+&#63;"&(.+&#63;)&/a&.+&#63;&a href="(magnet:.+&#63;)" .+&#63;已上传 &b&(.+&#63;)&/b&, 大小 (.+&#63;),', 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纸,他不会说,坑爹啊!!!……
都说现在是信息爆炸的时代,所以比的还是谁的数据挖掘能力强
好吧,那么问题来了学习挖掘机(数据)技术到底哪家强?
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 网络数据爬取 的文章

 

随机推荐