1. 本系列前言

一直想写Python与SEO的系列文章,因为随着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的详细内容可以看这篇文章,这里只举一个简单的例子。

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

玉渊潭樱花节

地      址:

游玩时间:预计4小时

可以通过..这个特征来获取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()函数来过滤多余的空格和换行

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的一生,版权在图片上。

python与seo应用_Python在我SEO工作中的应用一 - 数据采集相关推荐

  1. python 数据框缺失值_Python:处理数据框中的缺失值

    python 数据框缺失值 介绍 (Introduction) In the last article we went through on how to find the missing value ...

  2. python在日常工作处理中的应用-近期工作中应用Python的一些经验总结

    本文由Markdown语法编辑器编辑完成. 1. Python 在来新公司前,也间断地接触过Python编程,比如医学影像处理的图像库VTK就已经有Python的实现:Paraview也可以开启Pyt ...

  3. python结巴分词代码_python结巴分词SEO的应用详解

    本帖最后由 为人生而奋斗 于 2019-10-15 16:19 编辑 结巴分词在SEO中可以应用于分析/提取文章关键词.关键词归类.标题重写.文章伪原创等等方面,用处非常多. 具体结巴分词项目:htt ...

  4. python list 删除元素_Python的list循环遍历中,删除数据的正确方法

    初学Python,遇到过这样的问题,在遍历list的时候,删除符合条件的数据,可是总是报异常,代码如下: num_list = [1, 2, 3, 4, 5]print(num_list)for i ...

  5. python正则匹配数字_python 正则匹配字母数字中的任意数字,字母

    原博文 2018-08-08 21:31 − ([1-9]\d*.\d*|0.\d*[1-9]\d*) (.*$) 字符串为:6.12 ounces... 相关推荐 2019-09-28 21:13 ...

  6. python requests超时时间_python - requests 库 使用过程中timeout值最大可设值?

    问 题 请问 requests 库 使用过程中timeout错误的默认时间是多长呢? 查看源码 理论上 timeout值可以任意设? 默认 timeout 值 是怎么来的呢? 如果我想设一个比较大的t ...

  7. python pip在哪里_Python 2.7.9(Linux)中的pip在哪里

    我意识到这个问题可能真的很愚蠢,但我不能为我的生活找出安装python 2.7.9时我能找到pip的地方.我知道pip捆绑在这个版本及以上版本中,但我仍然无法找到它.我没有常规的写权限,也没有包管理器 ...

  8. python访问网页变量_Python 如何访问外围作用域中的变量

    在表达式中引用变量时,Python 会按照如下的顺序遍历各个作用域,寻找该变量: 当前函数作用域 任何外围作用域(比如包含当前函数的其他函数) global 作用域,即代码所在的模块的作用域 如果上述 ...

  9. python生成shell脚本_Python设置在shell脚本中自动补全功能的方法

    本篇博客将会简短的介绍,如何在ubuntu中设置python自动补全功能. 需求:由于python中的内建函数较多,我们在百纳乘时,可能记不清函数的名字,同时自动补全功能,加快了我们开发的效率. 方法 ...

最新文章

  1. Nature Methods:宏基因组物种组成分析工具MetaPhlAn2
  2. matlab和C如何混编
  3. ThinkPHP之MVC简析
  4. 从零开始学习docker(十三)Docker Compose--scale
  5. [html] input上传文件可以同时选择多张吗?怎么设置?
  6. java中关键字、标识符、常量、变量、数据类型
  7. SQL Server中的文件流
  8. php 循环 post,如何在php中使用jQuery递归调用POST循环请求
  9. java 静态成员 实例成员变量_java对象实例化时的顺序(静态成员变量、静态代码块、成员变量、方法块加载、构造函数加载)...
  10. Angr安装与使用之使用篇(十四)
  11. mvn spring-boot 打包成可运行的
  12. SI24R1:国产低功耗2.4GHz收发遥控工控答题卡方案芯片替代NRF24L01+
  13. 高考为什么考计算机信息,信息技术是否应该进入高考?
  14. 电脑通信端口带感叹号,如何解决网络适配器里黄色感叹号
  15. C# 使用NAudio合并mp3、wav音频文件
  16. 2017-09-04考试情况总结
  17. 解决windows10中springboot的jar启动之后的假死状态
  18. 达内微软mta证书有用吗_mta证书值得拿吗 怎么样才能拿到mta证书
  19. 好用免费的电脑摄像头录视频软件分享!
  20. [VCS]filelist.list的做法

热门文章

  1. 重庆2020计算机考研科目,2020年计算机考研大纲原文
  2. 503 Service Unavailable 异常是什么情况导致的。
  3. P2495 [SDOI2011]消耗战
  4. Leica 全站仪GSI数据格式(平面)
  5. mbp 封神台靶场 一(笔记)
  6. Wins10系统忘记开机密码快速解锁方法(图文教程)
  7. Probabilistic Volumetric Fusion for Dense Monocular SLAM
  8. 重识MySQL -《MySQL是怎样运行的》
  9. 万字长文,62道Java核心面试题,一次性打包送给积极向上的你
  10. Linux软件安装—软件包管理—rpm命令管理—包名与依赖性