爬虫抓取网页数据(网络爬虫学了也已有三个月了,怎么办?)
优采云 发布时间: 2021-12-14 05:25爬虫抓取网页数据(网络爬虫学了也已有三个月了,怎么办?)
也就是说,网络爬虫技术真的很香!
我已经学习了三个月的网络爬虫,所以让我们进行实践培训,看看它是如何工作的!
这次我们选择爬取“当当网”官方网页,网址“”(也可以选择其他网站)
开始我们的激烈操作吧~
一、新建项目和爬虫文件,搭建scrapy框架(这里我们将项目命名为“当当”)
1、在你的“特定文件夹”中打开cmd并输入以下代码
scrapy startproject dangdang
如果显示和我的一样,说明项目创建成功
2、创建蜘蛛,输入如下代码,注意:“cp”是爬虫的名字,“”是start_url,这是必不可少的
(这里我们给蜘蛛取名“cp”,我选择爬取微机原理和界面设计等书籍,也可以选择其他书籍类型)
先进入创建的项目“当当”,然后创建蜘蛛
>cd dangdang
>scrapy genspider cp dangdang.com
如果你显示的信息和我的一样,说明蜘蛛创建成功
3、打开“pycharm”,打开刚刚创建的“当当”项目,将chromedriver.exe放在这个项目的selenium下,然后新建一个调试“main.py”文件,如下:
注意:记住!!!
一定要把“chromedriver.exe”和新创建的“main.py”放在“当当”项目的根目录下!!!
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 在 Spider 中被采集到时,它会被传递到 Item Pipeline,这些 Item Pipeline 组件按照定义的顺序处理 Item。以下是Item Pipeline的一些典型应用:
五、修改默认给出的“items.py”
1、Item 对象是一个简单的容器,用于采集捕获的数据。
爬取哪些字段,爬虫解析页面时只能使用定义的字段,所以需要在items.py中定义
2、 Item中只有一种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”表中
双击打开表格,就是你爬取过的内容!
恭喜完成本次实战!