爬虫学习笔记

selenium

环境配置

  1. 安装浏览器驱动 地址
  2. 下载 selenium pip install selenium
  3. 将驱动放在项目根目录(不需要设置环境变量或引入驱动所在路径)

操作

1. 基本结构

from selenium import webdriver
from lxml import etree
from time import sleep


driver = webdriver.Chrome() # 得到一个对象可以进行各种操作

driver.get('https://ssr1.scrape.center/')

# driver.execute_script('window.scrollTo(0,4000)')
text_page = driver.page_source # 获取网页文件

tree = etree.HTML(text_page) # 得到一个xpath操作对象
lists = tree.xpath('//div[@class="el-row"]/div[2]/a//text()')
for item in lists:
    print(item)
sleep(5) # 延迟关闭浏览器
driver.close()

# * get() 请求的地址
# * send_keys('xxx) 给标签输入内容
# * find系列方法 定位标签得到标签
# * execute_script() 执行js脚本
# back() forword() 前进后退

正则表达式

问题一:python字符串和原始字符串的区别?

  1. python会将字符串中的所有反斜杠开头的字符进行转义,如果可以转义就转义不然就原样输出
  2. 原始字符串r'',会使转义字符不进行转义,直接显示出来,如:r'\t' --> \t

贪婪模式和非贪婪模式

默认情况下,匹配的元字符总是尽量多的向后匹配内容(贪婪)
让匹配的元字符尽量少的向后匹配内容(非贪婪)

在元字符后面加上?就变成非贪婪模式>?就变成非贪婪模式

分组

用()括起来,把括起来的作为一个整体操作

  • 捕获组

    给组起名字

    r'(?P<name>xxx)'  # ?P<name> name:起名字
    

scrapy

5+2的模式:五个模块,两个中间件

not found 404

五大模块简介

  1. splider
    编写爬虫逻辑
  2. scheduler
    调度spider(将spider url放入栈处理)
  3. engine
    负责各个模块之间的通信
  4. downloader
    从网上下载数据
  5. pipline
    处理数据,做持久化存储

其中scheduler、engine、downloader由框架自动调用

创建scrapy项目

  1. 创建项目

    scrapy startproject 项目名
    
  2. 创建爬虫文件

    scrapy genspider 爬虫文件名 域名(xx.xx.com)
    
  3. 编写爬虫文件
    spider --> yield --> pipline ...

    import scrapy
    
    class CateyeSpider(scrapy.Spider):
    	name = "cateye"
    	allowed_domains = ["https://ssr1.scrape.center/"]
    	start_urls = ["https://ssr1.scrape.center/"]
    
    	def parse(self, response):
    		for data in response.css(".el-card .el-row h2::text"):
    			try:
    				yield {"name": data.get()}
    				# print(data)
    			except:
    				pass
    
    
    	# response --> 返回downloader下载回的内容
    	# 	-- response解析HTML的方法
    	#		-- css
    	#		-- xpath
    	#		-- re
    	#		-- extract
    
  4. 运行爬虫

    scrapy crawl 爬虫文件
    

持久化存储

  1. 基于指令
  2. 基于管道
    class Demo01Pipeline:
    
    def open_spider(self, spider): # 爬虫开始调用一次
        pass
    
    def process_item(self, item, spider): # 处理爬虫数据,每条数据调用一次
        return item # 提交给下一个管道
    
    def close_spider(self, spider): # 爬虫结束调用一次
        pass
    
posted @ 2021-07-09 16:50  panmengxiang  阅读(63)  评论(0)    收藏  举报