首先我采用anacoda环境,需要首先建造一个项目,并激活
建立一个爬虫项目:
conda create -n Spider python == 3.6.2
conda create -n Spider python == 3.6.2
然后激活环境
activate Spider
再此环境下需要下载scrapy模块和pywin32模块
pip install scrapy
pip install pywin32
具体Scrapy 安装流程参考:http://doc.scrapy.org/en/latest/intro/install.html#intro-install-platform-notes 里面有各个平台的安装方法
1、使 用 Scrapy 时 遇 到 0: UserWarning: You do not have a working installation of theservice_identity module: 'cannot import name 'opentype''. Please install it from ..的问 题解决http://www.bubuko.com/infodetail-2467560.html
2、报 etree的错误
原因:默认安装的 lxml 版本太高(默认安装最新版),卸载后,重新安装 3.8 以下版本
conda uninstall lxml
conda install lxml==3.8
3、解决 Scrapy 安装错误:Microsoft Visual C++ 14.0 is required... 问题描述:
当前环境 win7,python_3.6.1,64 位。
在 windows 下,在 dos 中运行 pip install Scrapy 报错:
error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools
解决方法;
http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 下载 twisted 对应版本的 whl 文件(如我的 Twisted-18.4.0-cp36-cp36m-win_amd64.whl),cp 后面是 python 版本,amd64 代表 64 位,运行命令:
pip install C:\Users\ibm\Downloads\Twisted-18.4.0-cp36-cp36m-win_amd64.whl
4、解决 scrapy 运行报 No module named 'win32api
解决方法:
pip install pywin32
如果网速不行,可登录:https://pypi.org/project/pywin32/#files,进行下载
然后开始在此环境下建立scrapy项目
创建的命令是 scrapy startproject 项目名称
例如要爬取boss直聘中所有的python职位
首先建立项目
scrapy startproject 项目名称
scrapy startproject mySpider
然后进入该目录下
其中, mySpider 为项目名称,可以看到将会创建一个 mySpider 文件夹。我们使用
pycharm 打开这个项目,目录结构大致如下:
下面来简单介绍一下各个主要文件的作用:
scrapy.cfg :项目的配置文件
mySpider/ :项目的 Python 模块,将会从这里引用代码
mySpider/items.py :项目的目标文件
mySpider/pipelines.py :项目的管道文件
建立好需要爬取的字段
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html
import scrapy
class Day0510Item(scrapy.Item): # 声明字段
# define the fields for your item here like:
# 定义需要的字段
name = scrapy.Field()
Responsibility = scrapy.Field()
class Boss0510Item(scrapy.Item): # 声明字段
# define the fields for your item here like:
# 定义需要的字段
title = scrapy.Field()
salary = scrapy.Field()
request = scrapy.Field()
name = scrapy.Field()
biaoqian = scrapy.Field()
mySpider/settings.py :项目的设置文件
mySpider/spiders/ :存储爬虫代码目录
以爬boss直聘所有python职位的前十页为例
首先创建爬取程序
scrapy gender boss zhipin.com
创建的程序在spider目录下
现在items文件定义存储字段,明确存储信息
代码如下
然后开始编写爬取程序
代码如下
# -*- coding: utf-8 -*-
import scrapy
from lxml import etree
from day0510.items import Boss0510Item
class BossSpider(scrapy.Spider):
name = 'boss'
allowed_domains = ['zhipin.com']
start_urls = []
for page in range(1,11):
url = 'https://www.zhipin.com/c101010100/?query=python&page={}&ka=page-next'.format(page)
start_urls.append(url)
def parse(self, response):
try:
content = response.body.decode('utf-8')
# with open('boss.html','w',encoding='utf-8') as fp:
# fp.write(content)
tree = etree.HTML(content)
li_list = tree.xpath('//div[@class="job-list"]/ul/li')
for li in li_list:
item = Boss0510Item()
title = li.xpath('.//div[@class="job-title"]/text()')[0]
salary = li.xpath('.//span[@class="red"]/text()')[0]
request = li.xpath('.//div[@class="info-primary"]/p/text()')
name = li.xpath('.//div[@class="info-company"]//h3/a/text()')
biaoqian = li.xpath('.//div[@class="info-company"]//p//text()')
print(biaoqian)
item['title'] = title
item['salary'] = salary
item['request'] = request
item['name'] = name
item['biaoqian'] = biaoqian
# with open('boss1.txt','a',encoding='utf-8') as fp:
# fp.write(title+salary+request+name+biaoqian+'\n')
yield item
except:
pass
当 Item 在 Spider 中被收集之后,它将会被传递到 Item Pipeline,这些 Item Pipeline 组件
按定义的顺序处理 Item
pipelines文件代码如下:
# -*- coding: utf-8 -*-
import json
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
# 管道
class Day0510Pipeline(object):
def process_item(self, item, spider):
# 在这个地方存储数据,可以写入文件中,也可以写进文件库
fp = open('tencent.json','a',encoding='utf-8')
json.dump(dict(item),fp,ensure_ascii=False)
return item
class BossPipeline(object):
def process_item(self, item, spider):
# 在这个地方存储数据,可以写入文件中,也可以写进文件库
# fp = open('boss.txt','a',encoding='utf-8')
# json.dump(dict(item),fp,ensure_ascii=False)
with open('boss.txt','a',encoding='utf-8') as fp:
fp.write(json.dumps(dict(item),ensure_ascii=False)+'\n')
return item
setting设置文件中需要注意的是;
需要启用一个 Item Pipeline 组件,为了启用Item Pipeline组件,必须将它的类添加到 settings.py文件ITEM_PIPELINES 配置,就像下面所示:
将反爬虫协议改为False,默认是true,不该无法进行
然后就可以运行了:
命令是:在后台输入scrapy crawl boss
或者可以在根目录下创建一个main.py文件
里面的程序如图所示:
from scrapy import cmdline
# cmdline.execute("scrawl crawl taoche --nolog".split())
cmdline.execute("scrapy crawl boss".split())
在settings.py文件可以写入运行的日志文件