【张亚楠】Python在我SEO工作中的应用(1)

  • A+
所属分类:SEO好文章
本文信息本文由方法SEO顾问发表于2015-11-1814:36:03,共 3373 字,转载请注明:【张亚楠】Python在我SEO工作中的应用(1)_【方法SEO顾问】

1. 本系列前言

一直想写PythonSEO的系列文章,因为随着SEO工作的开展,以及自身Python水平的提高,Python在SEO中的应用越来越多,使用的范畴也越来越广。

本系列暂时计划分为几个主题,将在近几周完成:

  • 数据采集
  • 关键词拓展
  • 数据系统
  • 工具篇

适用人群:具有Python基础的SEOer(没有Python基础的直接往下拉,看推荐的Python教程)。

2. SEO与数据采集

SEO工作离不开数据采集。获取某个频道所有URL,查询一批网页的收录/排名情况,采集竞争对手的特定数据,都需要用到数据采集。

特别是对个人站长来说,只有通过数据采集才能获得大量数据,并生成网页。

3. 原始爬虫

最原始的爬虫爬虫可以只是发送一个HTTP请求,并获取返回的响应数据,使用Requests三行就可以写出一个简单的爬虫,代码如下:

import requests r = requests.get('http://www.zhidaow.com') print r.content 

  • 关于Requests的入门教程可以看我这篇文章
  • 除了Requests,还可以使用python标准库urllib,urllib2。

4. 高级爬虫

给原始爬虫升级几个技能就可以投入使用了,我经常升级以下几个功能。

4.1 获取特定字段: BeautifulSoup+Requests

BeautifulSoup可以将HTML解析为DOM树,然后获取特定字段。关于BeautifulSoup的详细内容可以看这篇文章,这里只举一个简单的例子。

以下是途牛某游玩页面的部分代码

<div class="des"> <h1 class="mb_10">玉渊潭樱花节</h1> <p class="address mb_5"><em class="c_999">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 址:</em></p> <p class="othmes"> <span class="t1"><em class="c_999">游玩时间:</em>预计<b class="c_f80">4小时</b></span> </p> </div> 

可以通过<b class="c_f80">..</b>这个特征来获取4小时这个字段:

import requests from bs4 import BeautifulSoup as bs url = 'http://www.tuniu.com/play/9232/' r = requests.get(url) soup = bs(r.content) print soup.find('b', class_='c_f80').string #输出字段有空格,可以通过strip()函数来过滤多余的空格和换行 

:也可以用requests和lxml的方式抓取。

4.2 使用代理

为避免屏蔽,抓取时通常需要代理,使用Requests的proxies参数可以实现这个效果。接上面代码:

proxies = { "http": "http://10.10.1.10:3128", "https": "http://10.10.1.10:1080", } r = requests.get(url, proxies=proxies) 

如果代理需要账户和密码,则需这样:

proxies = { "http": "http://user:pass@10.10.1.10:3128/", } 

4.3 模拟百度蜘蛛

抓取时模拟搜索引擎蜘蛛是个好主意,这里就以User-Agent试图模仿百度蜘蛛去抓取:

headers = { 'User-Agent': 'Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)', } r = requests.get(url, headers=headers) 

4.4 多线程抓取

为了提高抓取速度,一般都会采用多线程的方式去抓取,我在这篇文章中采用了第三方库threadpool的形式实现了多线程。在这里我采用另外一种形式,用标准库multiprocessing来实现:

import requests from bs4 import BeautifulSoup as bs from multiprocessing.dummy import Pool as ThreadPool #URL列表 urls = [ 'http://www.tuniu.com/play/9232/', 'http://www.tuniu.com/play/9231/', 'http://www.tuniu.com/play/9237/', 'http://www.tuniu.com/play/9234/', # etc..  ] #提取字段函数 def get_play_time(url): r = requests.get(url) soup = bs(r.content) print soup.find('b', class_='c_f80').string.strip() #设置线程数 pool = ThreadPool(4) #开启多线程 results = pool.map(get_play_time, urls) #关闭线程并等待结束 pool.close() pool.join() 

:这个多线程的实现主要参考了这篇文章

4.5 requests+正则

有时候如果所需字段出现在JS等DOM树之外,可以直接使用正则的方式获取,有时候速度反而会更快一点。

4.6 抓取网页JS内容

很多网站会将重点内容放在JS中,增加了抓取的难度。这种可以通过Selenium+PhantomJS+Xpath的方式抓取。

5. 终极爬虫

终极爬虫就属Scrapy了。Scrapy可以理解为搜索引擎爬虫的雏形,可以沿着初始URL列表进行抓取,并且可以设置抓取深度,抓取字段,抓取URL,抓取频率等等。

另外,还可以加入随机代理,随机UA,分布式抓取,入库等高级功能,并且还可以与selenium结合对JS生成的元素进行抓取。很多比价网站都是用Scrapy做商城爬虫,Scrapy也是爬虫工程师的必备技能之一。我对官方教程里的基础示例做了修改,示范下基础爬虫的代码:

import scrapy class TuniuSpider(scrapy.Spider): name = 'tuniu' # 设置爬虫名称,这里没卵用 start_urls = ['http://www.tuniu.com/guide/d-beijing-200/jingdian/'] # 设置初始抓取链接 def parse(self, response): for href in response.css('.mgl_pic a::attr(href)'): # 用CSS提取链接,也可以用xpath,beautifulsoup提取 yield scrapy.Request(href.extract(), callback=self.parse_poi) # 提出的链接用parse_poi函数处理 def parse_poi(self, response): yield { 'name': response.css('h1 a::text').extract()[0], # 用CSS规则从网页中提取字段 'english': response.css('.english::text').extract()[0], } 

之后就可以使用scrapy runspider tuniu_spider.py -o tuniu_poi.json进行抓取了。

推荐教程

:Scrapy依赖很多其他库,如lxml,Twist,所以安装起来会比较麻烦,之后可能会单独写一篇文章讲Scrapy。

6. Python教程推荐

  • 入门教程:笨方法学Python(练习中学习,很快有成就感)
  • 基础学习:《Python核心编程》,或者其他系统讲解Python原理及标准库的书
  • 进阶学习:《Python Cookbook》
  • 熟读资料:Python文档

7. 备注

  • Python只是抓取工具,火车头也是一款不错的抓取工具,我跟隔壁小伙伴培训就是讲的火车头采集,界面简单,容易上手;
  • 题图为SEO的一生,版权在图片上。

文章来源:张亚楠博客http://www.zhidaow.com/post/python-seo1

  • 版权声明:除非注明,本博客均为北京SEO方法的原创文章,转载或引用请以超链接形式标明本文地址,否则会在SEO圈内公开此种不尊重版权的行为,谢谢合作!本文地址:https://seofangfa.com/seo-articles/python-seo1.html
  • 转载请注明:【张亚楠】Python在我SEO工作中的应用(1)_ 【方法SEO顾问】

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: