网站解封,网页游戏大全网址,国内外婚纱网站建设现状,搭建一个网站教程尚硅谷Python爬虫教程小白零基础速通#xff08;含python基础爬虫案例#xff09; 内容包括#xff1a;Python基础、Urllib、解析#xff08;xpath、jsonpath、beautiful#xff09;、requests、selenium、Scrapy框架
python基础 进阶#xff08;字符串 列表 元组 字典…尚硅谷Python爬虫教程小白零基础速通含python基础爬虫案例 内容包括Python基础、Urllib、解析xpath、jsonpath、beautiful、requests、selenium、Scrapy框架
python基础 进阶字符串 列表 元组 字典 文件 异常
页面结构
爬虫 urllib_get请求的quote方法
编码集的演变 由于计算机是美国人发明的因此最早只有127个字符被编码到计算机里也就是大小写英文字母、数字和一些符号 这个编码表被称为ASCII编码比如大写字母A的编码是65小写字母z的编码是122。 但是要处理中文显然一个字节是不够的至少需要两个字节而且还不能和ASCII编码冲突 所以中国制定了GB2312编码用来把中文编进去。 你可以想得到的是全世界有上百种语言日本把日文编到Shift_JIS里韩国把韩文编到Euc-kr里 各国有各国的标准就会不可避免地出现冲突结果就是在多语言混合的文本中显示出来会有乱码。 因此Unicode应运而生。Unicode把所有语言都统一到一套编码里这样就不会再有乱码问题了。 Unicode标准也在不断发展但最常用的是用两个字节表示一个字符如果要用到非常偏僻的字符就需要4个字节。 现代操作系统和大多数编程语言都直接支持Unicode。 urllib_get请求的urlencode方法 urllib_post ajax的get请求 豆瓣电影前十页 ajax的post请求
肯德基的餐厅信息 判断ajax请求 异常 urllib_cookie登录
数据采集的时候需要绕过登录进入某个页面
代理池 解析
xpath 获取百度网页百度一下 站长素材 JsonPath BeautifulSoup 爬取星巴克数据 Selenium
Selenium 驱动下载后解压放在项目目录下 Phantomjs(基本被淘汰) 驱动下载后解压放在项目目录下
Chrome handless requests 超级鹰平台能够识别验证码图片
scrapy
scrapy Scrapy是一个为了爬取网站数据提取结构性数据而编写的应用框架。可以应用在包括数据挖 掘信息处理或存储历史数据等一系列的程序中。
# (1) pip install scrapy
# (2)错1 building twisted.test.raiser extension
#error: Microsoft Visual C 14.0 is required. Get it with Microsoft
#Build Tools: http://landinghub.visualstudio.com/visual-cpp-build-too
#解决1
#http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
#Twisted-20.3.0-cp37-cp37m-win_amd64.whl
#cp是你的python版本
#amd是你的操作系统的版本
#下载完成之后使用pip install twistec的路径安装
#切记安装完twisted再次安装scrapy
# (3)报错2 示python -m pip install --upgrade pip
#解决2 运行python -m pip install --upgrade pip
# (4)报错3 win32的错误
#解决3 pip install pypiwin32
# (5) anaconda1. scrapy项目的创建以及运行1.创建scrapy项目
终端输入 scrapy startproject 项目名称不能数字开头不能有汉字项目组成
spiders
init_.py 自定义的爬虫文件.py -》由我们自己创建是实现爬虫核心功能的文件 init_.py
items.py --》定义数据结构的地方是一个继承自scrapy.Item的类
middlewares. py --》中间件代理
pipelines.py --》管道文件里面只有一个类用于处理下载数据的后续处理默认是300优先级值越小优先级越高1-1000
settings.py 》配置文件比如是否遵守robots协议User-Agent定义等2.创建爬虫文件
要在spiders文件夹中去创建爬虫文件
cd项目的名字\项目名字\spiders
cd scrapy_baidu_091\scrapy_baidu_091\spiders创建爬虫文件
scrapy genspider 爬虫文件的名字 要爬取网页
eg:scrapy genspider baidu www.baidu.com
一般情况下不需要添加http协议 因为start_urls的值是根据allowed_domains修改的所以添加了http的话那么start_urls就需要我们手动去修改了生成的baidu.py
import scrapy
class BaiduSpider(scrapy. Spider):#爬虫的名字用于运行爬虫的时候使用的值name baidu#允许访问的域名allowed_domains [http://www.baidu.com]#起始的url地址指的是第一次要访问的域名# start_urls 在allowed_domains前面添加一个http://#在 allowed_domains的后面添加一个/ start_urls [http: //http: //www. baidu. com/] #是执行了start_urls之后执行的方法方法中的response就是回的那个对象# 相当 response urllib.request.urlopen() # response requests. get()def parse(self, response):#字符串# content response. text#二进制数据# content response. body# print(# print(content)span response. xpath(//div[idfilter]/div[classtabs]/a/span)[0] print()print(span. extract()# response的属性和方法# response.text# 获取的是响应的字符串# response.body# 获取的是二进制数据# response.xpath 可以直接是xpath方法来解析response中的内容 response. extract(# 提取seletor对象的data属性值# response.extract_first(提取的seletor列表的第一个数据
3.运行爬虫代码
scrapy crawl 爬虫名字
eg:scrapy crawl baidu4. settings.py-ROBOTTXT_OBEYTRUE注释掉2. scrapy架构组成1引擎–》自动运行无需关注会自动组织所有的请求对象分发给下载器 2下载器-》从引擎处获取到请求对象后请求数据 3spiders–》Spider类定义了如何爬取某个或某些网站。包括了爬取的动作例如是否跟进链接以及如何从网页的内容中提取结构化数据爬取item。换句话说 Spider就是您定义爬取的动作及分析某个网页或者是有些网页的地方。 4调度器-》有自己的调度规则无需关注 5管道Item pipeline—》最终处理数据的管道会预留接口供我们处理数据 当Item在Spider中被收集之后它将会被传递到Item Pipeline一些组件会按照一定的顺序执行对Item的处理。 每个item pipeline组件有时称之为“Item Pipeline是实现了简单方法的Python类。他们接收到Item并通过它执行一些行为同时也决定此Item是否继续通过pipeline或是被丢弃而不再进行处理。 以下是item pipeline的一些典型应用 1.清理HTML数据 2.验证爬取的数据检查item包含某些字段 3.查重并丢弃 4.将爬取结果保存到数据库中
class CarSpider(scrapy. Spider):name carallowed_domains [https: //car. autohome. com. cn/price/brand-15. html]#注意如果你的请求的接口是html为结尾的那么是不需要加/的start_urls [https: //car, autohome. com. cn/price/brand-15. html]def parse(self, response):name_list response. xpath(//div[classmain-title]/a/text())price_list response. xpath(//div[classmain-lever]//span/span/text) for i in range(len(name_list)):name name_list[i].extract()price price_list[i].extract()print(name, price)3. scrapy工作原理2. scrapy shell 1.什么是scrpy shell? Scrapy终端是一个交互终端供您在未启动spider的情况下尝试及调试您的爬取代码。其本意是用来测试提取 数据的代码不过您可以将其作为正常的Python终端在上面测试任何的Python代码。 该终端是用来测试XPath或CSS表达式查看他们的工作方式及从爬取的网页中提取的数据。在编写您的spider时该 终端提供了交互性测试您的表达式代码的功能免去了每次修改后运行spider的麻烦。 一旦熟悉了Scrapy终端后您会发现其在开发和调试spider时发挥的巨大作用。 2.安装ipython 安装pip install ipython 简介:如果您安装了 IPythonScrapy终端将使用 IPython替代标准Python终端。 IPython 终端与其他 相比更为强大提供智能的自动补全高亮输出及其他特性。 直接在终端输入 scrapy shell www.baidu.com 3. yield 1.带有yield的函数不再是一个普通函数而是一个生成器generator可用于迭代 2.yield是一个类似 return的关键字迭代一次遇到yield时就返回yield后面右边的值。重点是下一次迭代时从上一次迭代遇到的yield后面的代码下一行开始执行 3.简要理解yield就是return返回一个值并且记住这个返回的位置下次迭代就从这个位置后下一行开始案例1.当当网 1yield2.管道封装3.多条管道下载4多页数据下载
import scrapyclass ScrapyDangdang095Item(scrapy.Item):# 定义下载的数据都有什么src scrapy.Field()name scrapy.Field()price scrapy.Field()import scrapy
from scrapy_dangdang_095.items import ScrapyDangdang095Item
class DangSpider(scrapy. Spider):name dangallowed_domains [http: //category.dangdang.com/cp01.01.02.00.00.00.html] start_urls [http: //category.dangdang.com/cp01.01.02.00.00.00.html]def parse(self, response):#pipelines#items#定义数据结构的#src //ul[idcomponent_59]/li//img/src#alt //ul[idcomponent_59]/li//img/alt#price //ul[idcomponent_59]/li//p[classprice]/span[1]/text()#所有的seletor的对象都可以再次调用xpath方法li_list response. xpath(//ul[idcomponent_59]/1i)for li in li list:src li. xpath(.//img/data-original).extract_first()if src:src srcelsesrc li. xpath(.//img/src).extract_first()name li. xpath(.//img/alt).extract_first()price li.xpath(.//p[classprice]/span[1]/text()).extract_first()book ScrapyDangdang095Item(srcsrc,namename,priceprice)# 获取一个book就将book交给pipelinesyield booksettings中开启管道,以下代码注释解开 ITEM_PIPELINES { #管道可以有很多个 ‘scrapy_dangdang_095.pipelines.ScrapyDangdang095Pipeline’: 300, }
class ScrapyDangdang095Pipeline:#在爬虫文件开始的之前就执行的一个方法def open_spider(self, spider):self. fp open(book. json, w, encodingutf-8)# item就是yield后面的book对象def process_item(self, item, spider):#以下这种模式不推荐因为每传递过来一个对象那么就打开一次文件对文件的操作过于频繁##(1)write方法必须要写一个字符串而不能是其他的对象##(2)w模式会每一个对象都打开一次文件覆盖之前的内容# with open(book.json,a,encodingutf-8)as fp: #fp. write(str(item))self. fp. write(str(item))return item#在爬虫文件执行完之后执行的方法def close_spider(self, spider):self. fp. close()#多条管道开启
#(1)定义管道类
#2在settings中开启管道
class DangDangDownloadPipeline:def process_item(self, item, spider):url item. get(src)filename ./books/ item. get( name). jpgurllib. request. urlretrieve(url ur1, filename filename) return itemITEM _PIPELINES {
#管道可以有很多个那么管道是有优先级的优先级的范围是1到1000值越小优先级越高
scrapy_dangdang_095.pipelines.ScrapyDangdang095Pipeline: 300,
scrapy_dangdang_095. pipelines. DangDangDownloadPipeline: 301
}多页数据下载
import scrapy
from scrapy_dangdang_095.items import ScrapyDangdang095Item
class DangSpider(scrapy. Spider):name dang#allowed_domains [http: //category.dangdang.com/cp01.01.02.00.00.00.html] #如果是多页下载要调整allowed_domains的范围一般只写域名allowed_domains [category.dangdang.com] start_urls [http: //category.dangdang.com/cp01.01.02.00.00.00.html]base_url http://category.dangdang.com/pgpage 1def parse(self, response):#pipelines#items#定义数据结构的#src //ul[idcomponent_59]/li//img/src#alt //ul[idcomponent_59]/li//img/alt#price //ul[idcomponent_59]/li//p[classprice]/span[1]/text()#所有的seletor的对象都可以再次调用xpath方法li_list response. xpath(//ul[idcomponent_59]/1i)for li in li list:src li. xpath(.//img/data-original).extract_first()if src:src srcelsesrc li. xpath(.//img/src).extract_first()name li. xpath(.//img/alt).extract_first()price li.xpath(.//p[classprice]/span[1]/text()).extract_first()book ScrapyDangdang095Item(srcsrc,namename,priceprice)# 获取一个book就将book交给pipelinesyield book#每一页的爬取的业务逻辑全都是一样的所以我们只需要将执行的那个页的请求再次调用parse方法就可以了#http: //category. dangdang. com/pg2-cp01. 01. 02.00.00.00. html#http://category.dangdang.com/pg3-cp01.01.02.00.00.00.html#http: //category. dangdang. com/pg4-cp01. 01. 02. 00. 00. 00. htmlif self. page 100:self. page self. page 1url self.base_url str(self.page) -cp01.01.02.00.00.00.html#怎么去调用parse方法#scrapy.Request就是scrpay的get请求#url就是请求地址#callback是你要执行的那个函数注意需要加yield scrapy. Request(urlur1, callbackself. parse)2.电影天堂 1一个item包含多级页面的数据
import Scrapy
from scrapy movie 099. items import ScrapyMovie099Itemclass MvSpider(scrapy. Spider):name mvallowed_domains [https: //www. dytt8. net/html/gndy/china/index. html] start_urls [https: //www. dytt8. net/html/gndy/china/index. html]def parse(self, response):#要第一个的名字和第二页的图片a_list response. xpath(//div[classco_content8]//td[2]//a[2])for a in a list:#获取第一页name和要点击接name a.xpath(./text()). extract_first()href a.xpath(./href).extract_first()#对第二页的链接发起访问yield scrapy. Request(urlur1, callbackself. parse_second, meta(name: name)def parse_second(self, response):#注意如果拿不到数据的情况下一定检查你的xpath语法是否正确src response. xpath(//div[idZoom]//img/src).extract_first()#接受到请求的那个meta参数的值name response. meta[ name]movie ScrapyMovie099Item(srcsrc, namename) yield movieclass ScrapyMovie099Pipeline:def open_spider(self, spider):self. fp open(movie. json, w, encodingutf-8)def process_item(self, item, spider):self. fp. write(str(item))return itemdef close_spider(self, spider):self. fp. close()Mysql (1)下载https:/dev.mysql.com/downloads/windows/installer/5.7.html (2)安装 (https: //jingyan.baidu.com/album/d7130635f1c77d13fdf475df.html) pymysql的使用步骤 1.pip install pymysql 2.pymysql. connect(host, port, user, password, db, charset) 3.conn. cursor() 4.cursor.execute() CrawlSpider 1.继承自scrapy.Spider 2.独门秘笈 CrawlSpider可以定义规则再解析html内容的时候可以根据链接规则提取出指定的链接然后再向这些链接发送请求 所以如果有需要跟进链接的需求意思就是爬取了网页之后需要提取链接再次爬取使用CrawlSpider是非常合适的 3.提取链接 链接提取器在这里就可以写规则提取指定链接 scrapy. linkextractors. LinkExtractor( allow ()#正则表达式提取符合正则的链接 deny (),#(不用)正则表达式不提取符合正则的链接 allow domains ()#(不用)允许的域名 deny_domains ()#(不用)不允许的域名 restrict xpaths ()),xpath提取符合xpath规则的链接 restrict css (#提取符合选择器规则的链接) 4.模拟使用 正则用法 links1 LinkExtractor(allowr’list_23_\d.html’) xpath用法 links2 LinkExtractor(restrict_xpathsr’//div[class“x”]‘) css用法 links3 LinkExtractor(restrict css’.x’) 5.提取连接 link. extract_links(response) 6.注意事项 【注1】callback只能写函数名字符串callback‘parse item’ 【注2】在基本的spider中如果重新发送请求那里的callback写的是 callbackself.parse_item 【稍后看】followtrue是否进就是取规则进行取 CrawlSpider案例 需求读书网数据入库 1.创建项目 scrapy startproject dushuproject 2.跳转到spiders路径 cd\dushuproject\dushuproject\spiders 3.创建爬虫类 scrapy genspider -t crawl read www.dushu.com 4.items 5.spiders 6.settings 7.pipelines 数据保存到本地 数据保存到mysq1数据库 import scrapy
from scrapy. linkextractors import LinkExtractor
from scrapy. spiders import CrawlSpider, Rule
from scrapy_readbook_101. items import ScrapyReadbook101Itemclass ReadSpider(CrawlSpider )
name read
allowed_domains [www. dushu. com]
start_urls [https: //www. dushu. com/book/1188_1. html]
rules
Rule(LinkExtractor(allowr/book/1188_\d\. html),
callbackparse_item,
followFalse),
)
def parse_item(self, response):
img_list response. xpath(//div[classbookslist]//img) for img in img_list:
name img. xpath(. /data-original). extract_first()
src img. xpath(./alt). extract_first()book ScrapyReadbook101Item(namename, srcsrc) yield book
return item开启管道写管道同之前数据入库 settings.py DB HOST 192.168.231.130#端口号是一个整数
DB PORT 3306
DB USER root
DB PASSWROD 1234
DB_NAME spider01
DB CHARSET utf8pipelines.py
class ScrapyReadbook101Pipeline:def open_spider(self, spider):self. fp open(book. json, w, encodingutf-8)def process_item(self, item, spider):self. fp. write(str(item))return itemdef close_spider(self, spider):self. fp. close()from scrapy. utils. project import get_project_settings
class MysqlPipeline:def open_spider(self, spider):settings get_project_settings()self. host settings DB_HOST]self. port settings DB_PORT]self. user settings DB_USER]self. password settings DB_PASSWROD]self. name settings DB_NAME]self. charset settings DB_CHARSET]self. connect()def connect(self):self. conn pymysql. connect(hostself. host,portself. port,userself. user,passwordself. password,dbself. name,charsetself. charsetself. corsor self. conn. cursor()def process_item(self, item, spider):sql insert into book(name, src) values({}, {}) format(item[name], item#执行sql语句self. cursor. execute(sql)#提交self. conn. commit()return itemdef close_spider(self, spider):self. cursor. close()self. conn. close()日志信息和日志等级 1日志级别 CRITICAL:严重错误 ERROR: 一般错误 I WARNING:警告 INFO: 一般信息 DEBUG:调试信息 默认的日志等级是DEBUG 只要出现了DEBUG或者DEBUG以上等级的日志 那么这些日志将会打印 2settings.py文件设置 默认的级别为DEBUG会显示上面所有的信息 在配置文件中 settings.py LOG_FILE:将屏幕显示的信息部记录到文件中屏幕不再显示注意文件后缀一定是.logLOG LEVEL:设置日志显示的等级就是显示哪些不显示哪些Request和response总结scrapy的post请求
import scrapy
import json
class TestpostSpider(scrapy. Spider):name testpostallowed_domains [https: //fanyi. baidu. com/sug]# post请求如果没有参数那么这个请求将没有任何意义#start_urls#parse方法也没有用了# start_urls https: //fanyi. baidu. com/sug/] ## def parse(self, response):# passdef start_requests(self):url https: //fanyi. baidu. com/sugdata{kw: final}yield scrapy. FormRequest(urlur1, formdatadata, callbackself.parse_second)def parse_second(self, response):content response. textobj json. loads(content, encodingutf-8)print(obj)代理