seo文章采集工具( Python与数据采集SEO的系列文章之2.本系列)

优采云 发布时间: 2021-10-25 14:19

  seo文章采集工具(

Python与数据采集SEO的系列文章之2.本系列)

  

  1.本系列前言

  一直想写一系列Python和SEO文章,因为随着SEO工作的发展和自身Python水平的提高,Python在SEO中的使用越来越多,范围也越来越广用途也越来越广泛。

  这个系列暂时计划分为几个主题,将在接下来的几周内完成:

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

  2. SEO 和数据采集

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

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

  3.原创爬虫

  最原创的爬虫可以只发送一个HTTP请求并获得返回的响应数据。你可以用三行请求写一个简单的爬虫。代码如下:

  import requests

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

print r.content

  注意:

  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()函数来过滤多余的空格和换行

  注意:您也可以使用 requests 和 lxml 进行捕获。

  4.2 使用代理

  为了避免阻塞,爬取的时候通常需要一个proxy,这个效果可以通过Requests的proxys参数来实现。按照上面的代码:

  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 多线程爬取

  为了提高爬取速度,一般采用多线程爬取。在本文中,我使用了第三方库线程池来实现多线程。这里我采用另一种形式,使用标准库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 个请求+常规

  有时如果需要的字段出现在 DOM 树之外比如 JS,可以通过常规方式直接获取。有时速度会更快。

  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 教程推荐7. 备注

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线