咱就是说,网络爬虫技术是真的香阿!
网络爬虫学了也已有三个月了,接下来进行实训考察一下效果如何把!
这次我们选择爬取 “当当” 官方网页,网址“www.dangdang.com”(你也可以选择别的网站)
接下来开始我们的一顿猛操作~
一、新建项目和爬虫文件,构建scrapy框架(这里我们把项目名称命名为 “dangdang”)
1、在你“特定的文件夹中”打开cmd,输入以下代码
scrapy startproject dangdang
如果显示和我一样的信息,就说明项目创建成功
2、创建spider,输入以下代码,注意:“cp”是爬虫名,“dangdang.com”是start_url,必不可少
(这里我们把spider名称命名为 “cp”,我选择爬取微机原理和接口设计这类图书,你也可以挑选别的图书种类 )
先进入创建的项目“dangdang”里面,再创建spider
>cd dangdang
>scrapy genspider cp dangdang.com
如果你显示的信息和我一样,说明spider创建成功
3、打开“pycharm”,打开刚刚创建的“dangdang”项目,把selenium下的chromedriver.exe放在此项目里,然后,新建调试“main.py”文件,是这样滴:
注意:请记住!!!
一定要把“chromedriver.exe”和新创建的“main.py”放在项目“dangdang”的根目录下!!!
OK,scrapy框架搭建好了,接下来就是编写代码~
二、创建“main.py”,并编写内容
from scrapy.cmdline import execute
execute("scrapy crawl cp".split())
两行代码敲完之后,先搁置一边
三、修改默认给出的“middleware.py”
找到“class DangdangDownloaderMiddleware:”下的“def process_exception(self, request, exception, spider):”,输入以下代码:
#创建浏览器实例化对象在爬虫文件中,用spider.bro调用
bro = spider.bro
#requst.url就是拦截到的爬虫文件发起的url
bro.get(request.url)
#获取页面源码
page = bro.page_source
#利用HtmlResponse()实例化一个新的响应对象
n_response = HtmlResponse(url=request.url,body=page,encoding='utf-8',request=request)
#返回新的响应对象
return n_response
四、全局配置“settings.py”
打开“settings.py”文件,
注意:以下所有需要设置的地方仅需去掉前边的注释号即可(除日志输出)
1、设置要爬取网站的“user_agent”,获取当当网的“user_agent”,复制至此
2、设置—是否遵守robots.txt
默认是“True”,即“遵守”,在Scrapy启动后,会在第一时间访问网站的 robots.txt 文件,然后决定该网站的爬取范围。
然而,我们并不是在做搜索引擎,而且在某些情况下我们想要获取的内容恰恰是被 robots.txt 所禁止访问的。所以,某些时候,我们就要将此配置项设置为 False ,拒绝遵守 Robot协议 !
3、设置输出日志信息为错误日志信息,以及输出错误级别为一般级别
#输出日志设为之输出发生错误的日志信息
#输出级别——一般级别
LOG_LEVEL = 'ERROR'
4、设置下载中间件,
5、设置Item Pipeline
当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item。以下是Item Pipeline的一些典型应用:
五、修改默认给出的“items.py”
1、Item对象是用于收集所抓取的数据的简单容器。
要爬取哪些字段,在爬虫解析页面时仅能使用已定义的这些字段,所以就需要在items.py中定义
2、在Item当中,它只有Field这一种类型,这个Field表示任何传递进来的数据类型都可以接收的
3、下图是默认已经给出的
我们想要爬取当当网中《微机原理与接口设计》的书名,作者,现价,日期,出版社,所以需要在items.py中定义这些字段,
六、修改默认给出的“pipelines.py”
下图是默认给出的
我们想要将爬取的信息储存到".xls",需改写此文件
from itemadapter import ItemAdapter
from openpyxl import Workbook
class DangdangPipeline:
def __init__(self):
self.wb = Workbook()
self.ws = self.wb.active
self.ws.append(['书名','作者','现价','日期','出版社'])
def process_item(self, items, spider):
line = [items['book_name'],items['author'],items['price'],items['time'], items['press']]
self.ws.append(line)
self.wb.save('./微机原理与接口设计.xls')
return items
重头戏来了!!!
七、编写spider——“cp.py”文件中的主代码
1、下图是默认给出的结构,接下来就我们需要补充,修改
2、此次实训完整代码
注意理解注释~
import scrapy
import time
from selenium import webdriver
from dangdang.items import DangdangItem
class CpSpider(scrapy.Spider):
name = 'cp' #指定爬虫文件名称
allowed_domains = ['dangdang.com'] #允许爬取的网站域名
#spider在启动时爬取的url列表,用于定义初始请求
#第一个要爬取的url
start_urls = ['http://search.dangdang.com/?key=%CE%A2%BB%FA%D4%AD%C0%ED%D3%EB%BD%D3%BF%DA%BC%BC%CA%F5&act=input&page_index=1']
page_index = 1 #第一页
offset = 1 #查询字符串参数
def __init__(self): #实例化浏览器对象
#selenium启动配置参数接收是ChromeOptions类
option = webdriver.ChromeOptions() #启动浏览器,最大化
#屏蔽谷歌浏览器正在接受自动化软件控制提示
option.add_experimental_option('excludeSwitches', ['enable-authmation'])
self.bro = webdriver.Chrome(options=option) #初始化
def parse(self, response):
items = DangdangItem()
lists = response.xpath('//*[@id="search_nature_rg"]/ul/li')
#遍历列表
for i in lists:
items['book_name'] = i.xpath('./p[@class="name"]/a/@title')[0].extract()
print('书名',items['book_name'])
author = i.xpath('./p[@class="search_book_author"]/span[1]//text()').extract()
author = ''.join(author).strip()
items['author'] = author
print("作者",items['author'])
items['price'] = i.xpath('./p[@class="price"]/span[1]/text()').get()
print('现价',items['price'])
items['time'] = i.xpath('./p[@class="search_book_author"]/span[2]/text()').get()
print('日期',items['time'])
items['press'] = i.xpath('./p[@class="search_book_author"]/span[3]/a/@title').get()
print('出版社',items['press'])
yield items #回调
time.sleep(5)
#通过parse()方法实现翻页
if self.offset < 6: #只爬取5页
self.offset += 1
self.page_index += 1
url='http://search.dangdang.com/?key=%CE%A2%BB%FA%D4%AD%C0%ED%D3%EB%BD%D3%BF%DA%BC%BC%CA%F5&act=input&page_index={}'\
.format(self.offset,self.page_index)
yield scrapy.Request(url=url,callback=self.parse)
#关闭浏览器
def closed(self,spider):
self.bro.close()
3、查看存储在表格中的内容
成功运行没有错误之后,将会把你所爬取的内容保存在“微机原理与接口设计.xls”表格中
双击打开表格,就是你所爬取的内容拉!
恭喜你完成此次实战!