一、入门案例
1、编写爬虫
创建 test.py 文件
# encoding: utf-8
"""
@author: sunxianpeng
@file: test.py
@time: 2019/10/26 18:37
"""
import scrapy
class Main(scrapy.Spider):
def __init__(self):
pass
# 爬虫的名字
name ="quote"
# 起始的url列表
start_urls = ['http://quotes.toscrape.com/']
# 固定函数,固定写法
def parse(self, response):
# css和 xpath 都可以实现
# quotes = response.css("div.quote")
quotes = response.xpath('//div[@class="quote"]')#和上述作用一样
for quote in quotes:
yield {
# extrack_first提取第一个选择器的内容
"text": quote.css('span.text::text').extract_first(),
"author": quote.xpath('./span/small/text').extract_first()
}
next_page = response.xpath('//li[@class="next"]/a/@href').extract_first()
if next_page:
# page下载完后,交给谁处理(再交给parse函数处理)
yield response.follow(next_page,self.parse)
if __name__ == '__main__':
m = Main()
2、本地运行测试
(1)Pycharm下,点击下方按钮
(2)切换到 .py文件所在的路径
cd spider/scrapy/
(3)运行命令
运行例子,并将结果保存在 csv 文件中
scrapy runspider test.py -o quotes.csv -t csv
二、迁木网爬虫
(1)Pycharm下,点击下方按钮
(2)切换到想要创建scrapy项目的路径,执行命令
scrapy startproject qianmu
显示
(3)执行命令
cd qianmu
tree
显示
(4)执行命令
指定爬虫的名字(qianmu_collage_rank)和爬取的域名(www.qianmu.org)
注意:爬虫名字不能和项目名字重复
scrapy genspider qianmu_collage_rank www.qianmu.org
(5)最终项目结构为
(6)编写爬虫程序
在 qianmu_collage_rank.py 文件中编写以下内容
# -*- coding: utf-8 -*-
import scrapy
class QianmuCollageRankSpider(scrapy.Spider):
name = 'qianmu_collage_rank'
# 允许爬的域名内的url,即爬取的网页必须以改域名开头
allowed_domains = ['www.qianmu.org']
# 爬虫的入口地址,可以写多个,
start_urls = ["http://www.qianmu.org/ranking/1528.htm"]
def parse(self, response):
""" start_urls请求成功后,自动调用该方法"""
# 解析start_urls, extract()提取所有符合条件的文本,extract()返回的永远是列表
# extract_first()在当解析出来的数据只有一个时可以使用
links = response.xpath('//tbody//tr[@height=19][position()>1]/td/a/@href')\
.extract()
for i in range(len(links)):
link = str(links[i])
if not link.startswith("http://www.qianmu.org"):
link = "http://www.qianmu.org/%s" % link
try:
# 让框架即系跟随这个链接,也就是说会再次发起请求
# 请求成功以后,会调用指定的call_back函数parse_collage
# 中间过程均是异步调用
yield response.follow(link,self.parse_collage)
except Exception as e:
continue
def parse_collage(self,response):
data = {}
keys = []
values = []
data["collage_name"] = response.xpath('//div[@id="wikiContent"]/h1/text()')[0]
# 处理单元格内有换行
table = response.xpath('//div[@id="wikiContent"]/div[@class="infobox"]//table')
if table :
table = table[0]
cols_k = table.xpath('.//td[1]')
cols_v = table.xpath('.//td[2]')
for j in range(len(cols_k)):
col_k = cols_k[j]
col_v = cols_v[j]
keys.append(''.join(col_k.xpath('./p//text()').extract()))
values.append(''.join(col_v.xpath('./p//text()').extract()))
# 合并两个列表组成字典,将zip后得到的字典 添加到data字典中
data.update(zip(keys, values))
# yield出去的数据,会被框架接收,进行下一步的处理,
# 如果没有任何处理,则会打印到控制台
yield data
(7)运行,并查看控制台输出结果
两种方式
a、运行scrapy爬虫
scrapy crawl qianmu_collage_rank
# 将爬取的数据导出到json文件或者csv文件
scrapy crawl qianmu_collage_rank -o qianmu_collage_rank.json
scrapy crawl qianmu_collage_rank -o qianmu_collage_rank.csv -t csv
b、单独运行爬虫文件
scrapy runspider qianmu_collage_rank.py