-
概念:Scrapy是一个快速、高层次的屏幕抓取和web抓取包
-
Scrapy的安装
pip3 install scrapy
-
scrapy简单实用-爬虫
3.1 创建一个测试的Scrapy项目:
scrapy startproject project_name
3.2 在items.py文件中设置要抓取的字段定义
import scrapy
class DemoItem(scrapy.Item):
#define the fields for you item here like:
#name = scrapy.Field()
title = scrapy.Field() #抓取的标题
link = scrapy.Field() #抓取的链接
3.3 先获取页面的内容看一看 在spiders文件夹内创建MydemoSpider.py
import scrapy
class MydemoSpider(scrapy.Spider):
# name表示爬虫的名字,在`scrapy crawl xx`时使用
name = “mydemo"
# allowed_domains定义了爬取的范围,限定在某几个域名内
allowed_domains = ['http://www.n360.cn']
# start_urls定义了从哪里开始爬取
start_urls = ['http://www.n360.cn']
# parse方法用于接收Downloader返回的结果
def parse(self,response):
with open('homepage','wb') as f:
f.write(response.body)
3.4 简单测试: 会在当前目录生成一个homepage,内容为页面的html代码
cd /Users/xietong/Desktop/mydemo/mydemo
scrapy crawl mydemo
3.5 了解scrapy的xpath语法
语法 | 含义 | |
---|---|---|
/html/head/title | 选择HTML文档中标签内的 |
|
/html/head/title/text() | 选择上面提到的title元素的文本 | |
//td | 选择所有的 | 元素 |
//div[@class=‘mine’] | 选择所有具有class='mine’属性的div元素 |
3.6 测试scrapy的xpath语法
# 终端输入,进入scrapy shell模式
$scrapy shell "http://www.n360.cn"
# response 可以用它查看网页信息
# response.headers 获取网页的请求头
# response.xpath('//title’) 获取页面title 返回的是Selector对象
# response.xpath('//title').extract() extract()方法会将Selector对象转化为列表对象
# response.xpath('//title/text()').extract() title标签的文本内容
# response.xpath("//ul[@class='newslist']").extract() 获取ul元素class属性为newslist
# 获取li标签
sites = response.xpath('//ul[@class="newslist"]/li’)
for site in sites:
# 获取a标签的text内容
title = site.xpath('a/text()').extract()
print(title)
3.7 直接修改MydemoSpider.py文件内容
import scrapy
from mydemo.items import DemoItem
class MydemoSpider(scrapy.Spider):
# name表示爬虫的名字,在`scrapy crawl xx`时使用
name = "mydemo"
# allowed_domains定义了爬取的范围,限定在某几个域名内
allowed_domains = ['http://www.n360.cn']
# start_urls定义了从哪里开始爬取
start_urls = ['http://www.n360.cn']
# parse方法用于接受Downloader返回的结果
def parse(self,response):
sites = response.xpath("//ul[@class='newslist']/li")
items = []
for site in sites:
item = DemoItem()
item['title'] = site.xpath('a/text()').extract()[0]
item['link'] = self.allowed_domains[0] + site.xpath('a/@href').extract()[0]
items.append(item)
return items
3.8 项目完整测试 结果生成json文件 并指定编码
# 将parse函数返回的结果进行导出,使用json格式
scrapy crawl demo -o items.json -t json -s FEED_EXPORT_ENCODING=UTF-8