一、安装
1、Python2.7
Linux默认都有Python,但若是2.6版本,则需要升级到2.7,升级到2.7需要以下步骤:
首先下载源tar包,可利用linux自带下载工具wget下载,如下所示:
wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz
下载完成后到下载目录下,解压;
tar -zxvf Python-2.7.3.tar.bz2
进入解压缩后的文件夹 cd Python-2.7.3
在编译前先在/usr/local建一个文件夹python27(作为python的安装路径,以免覆盖老的版本)
mkdir /usr/local/python27
在解压缩后的目录下编译安装
./configure –prefix=/usr/local/python27
make
make install
此时没有覆盖老版本,再将原来/usr/bin/python链接改为别的名字
mv /usr/bin/python /usr/bin/python_old
再建立新版本python的链接
ln -s /usr/local/python27/bin/python2.7 /usr/bin/python
这个时候输入 python
就会显示出python的新版本信息
Python 2.7.3 (default, Sep 29 2013, 11:05:02)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-54)] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
此时,Python升级成功。
2、安装anaconda2
anaconda可以看做Python的一个集成安装,安装它后就默认安装了python、IPython、集成开发环境Spyder和众多的包和模块,非常方便。Python2对应anaconda2,Python3对应anaconda3。
下载安装文件Anaconda2-4.2.0-Linux-x86_64.sh,然后执行 bash Anaconda2-4.2.0-Linux-x86_64.sh,后面接着傻瓜式的安装。
执行命令conda list 成功显示packages则安装成功。
3、安装scrapy
直接执行pip install scrapy即可。
二、使用
1、新建scrapy项目(本例子中将爬取智联招聘网上的招聘信息,存到json文件及MySQL)
爬取网址为http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC%2B%E4%B8%8A%E6%B5%B7%2B%E5%B9%BF%E5%B7%9E%2B%E6%B7%B1%E5%9C%B3%2B%E6%88%90%E9%83%BD&kw=%E5%A4%A7%E6%95%B0%E6%8D%AE&sm=0&p=1
scrapy startproject zhaopin
scrapy.cfg: 项目的配置文件
zhaopin/: 该项目的python模块。之后您将在此加入代码。
zhaopin/items.py: 项目中的item文件.
zhaopin/pipelines.py: 项目中的pipelines文件.
zhaopin/settings.py: 项目的设置文件.
zhaopin/spiders/: 放置spider代码的目录.
编写item:
import scrapy
class ZhaopinItem(scrapy.Item):
# define the fields for your item here like:
#职位
dowhat = scrapy.Field()
#公司
company = scrapy.Field()
#职位月薪
money = scrapy.Field()
#工作地点
adress = scrapy.Field()
#发布日期
publishdate = scrapy.Field()
#工作性质
#category = scrapy.Field()
#工作经验
# experience = scrapy.Field()
#最低学历
#need = scrapy.Field()
#职位类别
#level = scrapy.Field()
pass
```
编写spider
```python
# -*- coding: utf-8 -*-
import scrapy
from zhaopin.items import ZhaopinItem
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
class MySpider(scrapy.Spider):
#设置name
name = "MySpider"
#设定域名
allowed_domains = ["zhaopin.com"]
#填写爬取地址
start_urls = ["http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC%2B%E4%B8%8A%E6%B5%B7%2B%E5%B9%BF%E5%B7%9E%2B%E6%B7%B1%E5%9C%B3%2B%E6%88%90%E9%83%BD&kw=%E5%A4%A7%E6%95%B0%E6%8D%AE&sm=0&p=1"]
#编写爬取方法
def parse(self, response):
#实例一个容器保存爬取的信息
item = ZhaopinItem()
#这部分是爬取部分,使用xpath的方式选择信息,具体方法根据网页结构而定
#先获取每个课程的div
for box in response.xpath('//table[@class="newlist"]/tr[1]'):
#获取职位
item['dowhat'] = box.xpath('.//td[@class="zwmc"]/div/a').xpath('string(.)').extract()
#获取公司名
item['company'] = box.xpath('.//td[@class="gsmc"]/a/text()').extract()
#获取money
item['money'] = box.xpath('.//td[@class="zwyx"]/text()').extract()
#获取adress
item['adress'] = box.xpath('.//td[@class="gzdd"]/text()').extract()
#获取publishdate
item['publishdate'] = box.xpath('.//td[@class="gxsj"]/span/text()').extract()
#返回信息
yield item
#url跟进开始
#获取下一页的url信息
url = response.xpath("//a[@class='next-page']/@href").extract()
print(url)
if url :
#将信息组合成下一页的url
page = url[0]
#返回url
yield scrapy.Request(page, callback=self.parse)
#url跟进结束
写到json文件
from scrapy.exceptions import DropItem
import json
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
class MyPipeline(object):
def __init__(self):
#打开文件
self.file = open('data.json', 'w')
#该方法用于处理数据
def process_item(self, item, spider):
#读取item中的数据
line = json.dumps(dict(item), ensure_ascii=False) + "\n"
#print(line)
#写入文件
self.file.write(line)
#返回item
return item
#该方法在spider被开启时被调用。
def open_spider(self, spider):
pass
#该方法在spider被关闭时被调用。
def close_spider(self, spider):
pass
写到MySQL
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import MySQLdb
class MySQLPipeline(object):
def __init__(self):
self.conn = MySQLdb.connect(host="192.168.1.102",user="root",passwd="root",db="spider",charset="utf8")
self.cursor = self.conn.cursor()
def process_item(self, item, spider):
sql = "insert ignore into zhaopininfo(dowhat, company, money, adress, publishdate) values(%s, %s, %s, %s, %s)"
param = (item['dowhat'], item['company'], item['money'], item['adress'], item['publishdate'])
self.cursor.execute(sql,param)
self.conn.commit()