爬虫抓取网页数据(网络爬虫学了也已有三个月了,怎么办?)

优采云 发布时间: 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=&#39;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={}&#39;\

.format(self.offset,self.page_index)

yield scrapy.Request(url=url,callback=self.parse)

#关闭浏览器

def closed(self,spider):

self.bro.close()

  3、查看表中存储的内容

  运行成功无错误后,你爬取的内容会保存在“微​​机原理与接口设计.xls”表中

  

  双击打开表格,就是你爬取过的内容!

  恭喜完成本次实战!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线