文武的客 - 爬虫
type: channel
link: https://binscor.top/index.php/tag/%E7%88%AC%E8%99%AB/
items: 8.用Scrapy框架进行爬取的案例
items: 7.Scrapy框架
items: 6.request请求的简单使用
items: 5.懒加载及自动化测试框架
items: 4.常用的数据解析方式
items: 3.登录相关、代理
items: 2.根据不同请求爬取数据(get、post)
items: 1.爬虫入门了解

8.用Scrapy框架进行爬取的案例
type: item
date: 2019-07-31T14:15:00+08:00
description: title: 8.用Scrapy框架进行爬取的案例date: 2019-07-31 14:15:50tags:爬虫Scrapycategories: Pythoncopyright: false只有一个页面，无需跳转的爬取案例文件下载创建项目： scrapy startproject 项目名scrapy startproject myFirstScrapy创建爬虫： scrapy genspider 爬虫名 域名scrapy genspideer intersting u148.cn[...]

7.Scrapy框架
type: item
date: 2019-07-31T12:04:00+08:00
description: Scrapy概述：是一个爬虫框架，提取结构性的数据。其可以应用在数据挖掘，信息处理等方面。提供了许多的爬虫的基类，帮我们更简便使用爬虫。基于Twisted首先安装依赖库Twistedpip install （依赖库的路径）在这个网址http://www.lfd.uci.edu/~gohlke/pythonlibs#twisted 下面去寻找符合你的python版本和系统版本的Twisted然后在安装scrapy框架pip install scrapy【注意】路径名不能有中文，不能用管理员进入cmd，电脑系统用户路径不能是中文框架简介该框架是一个第三方的框架，许多功能已经被封装好（比如：下载功能）由五部分构成：引擎、下载器、爬虫、调度器、管道（item和pipeline）以上五部分我们只需要关心其中的两部分：爬虫和管道spiders：蜘蛛或爬虫，我们分析网页的地方，我们主要的代码写在这里管道：包括item和pipeline，用于处理数据其他部分：了解引擎：用来处理整个系统的数据流，触发各种事务（框架的核心）下载器：用于下载网页内容，并且返回给蜘蛛（下载器基于Twisted的高效异步模型）调度器：用来接收引擎发过来的请求，压入队列中等处理任务简单用法（1）创建项目指令：scrapy startproject 项目名 （2）项目目录结构 firstSpider firstSpider spiders 爬虫目录（写代码位置） __init__.py myspider.py 爬虫文件,以后的爬虫代码写在这里 __init__.py items.py 定义数据结构地方 middlewares.py 中间件（了解） pipelines.py 管道文件 settings.py 项目配置文件 scrapy.cfg 项目创建处理，里面是没有爬虫的，我们需要通过指令来创建一个爬虫：cd firstSpider/firstSpider scrapy genspider qiubai “www.qiushibaike.com" 以上指令完事后，就会在firstSpider/firstSpider/spiders里面自动创建一个qiubai.pyqiubai.py文件：name: 爬虫的名字，启动的时候根据爬虫的名字启动项目allowed_domains：允许的域名，就是爬取的时候这个请求要不要发送，如果是该允许域名之下的url，就会发送，如果不是，则过滤掉这个请求，这是一个列表，可以写多个允许的域名start_urls：爬虫起始url，是一个列表，里面可以写多个，一般只写一个def parse(self, response): pass #这个函数非常重要，就是你以后写代码的地方，parse函数名是固定的， #当收到下载数据的时候会自动的调用这个方法，该方法第二个参数为 #response，这是一个响应对象，从该对象中获取html字符串，然后解析之 #【注】这个parse函数必须返回一个可迭代对象（3）定制item.py， 其实就是您的数据结构，格式非常简单，复制粘贴即可（4）撰写蜘蛛打印response对象，简单跑一把指令：cd firstSpider/firstSpider/spidersscrapy crawl qiubai 【注意】第一次抓取的时候如果出错，则 pip install pypiwin32根据response获取网页内容response.text 字符串类型response.body 二进制类型（5）运行scrapy crawl qiubai -o qiubai.json 保存为json文件crapy crawl qiubai -o qiubai.xml 保存为xml文件scrapy crawl qiubai -o qiubai.csv 保存为csv文件用Scrapy写爬虫的一步骤：1）创建项目 scrapy startproject 项目名2）创建爬虫 scrapy genspider 爬虫名 域名3）根据需求编写item4）在spiders里面解析数据5）在管道中处理解析完的数据6）运行： scrapy crawl 爬虫名 [-o xx.json/xml/csv]原理

6.request请求的简单使用
type: item
date: 2019-07-31T12:03:00+08:00
description: 概述：requests框架基于urllib封装的一个请求框架，、几乎包含urllib所有的请求功能，在其基础上进行了深度的拓展安装requestspip install requestsrequests的响应类res = requests.get(url) #res即为resquests的响应类属性说明encodingrequests从响应的header自动猜测出响应页面编码方式,该值默认为ISO-8859-1apparent_encodingrequests从响应页面猜测响应页面编码方式url响应的urlstatus_code响应的http状态码cookies响应的cookieselapsed发送请求到收到响应消耗的时间headers响应的headershistory请求历史headers响应的headerscontent页面源码，二进制的页面源码text也是页面源码，unicode，requests自动解码，返回str源码请求方法：requests.get(url, params=None, **kwargs) params={'':''}requests.post(url, data=None, json=None, **kwargs) data = {'':''}requests.head(url, **kwargs)requests.put(url, data=None, **kwargs)requests.patch(url, data=None, **kwargs)requests.delete(url, **kwargs)requests.request(method, url, **kwargs)以上就是requests全部的访问方法，并且全部都返回Request对象请求参数**kwargs参数说明params自动构建url，get请求时使用data提交表单，post请求时使用headers请求headerscookies请求cookiestimeout超时时间proxiesip代理json发送jsonfile发送文件（Multipart-Encoded）allow_redirectsauthverifystreamcert实例1：import requests # requests本身就是一个请求对象 res = requests.get("http://www.baidu.com/") print(res) #<Response [200]> url = "https://www.baidu.com/s?" # 加请求头 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'} # 创建参数 data = { "wd":"日本美女" } # 用requests对象发起请求 res = requests.get(url=url,headers=headers,params=data) # res是响应对象，包含响应头和响应体 # print(res.text) # 用字符串的格式提取出响应体 print(res.content) print(res.headers) # requests也不能解析js实例2：古诗文登录import requests from lxml import etree # 登录 # post请求 账户密码 两个token值 验证码 # 用登录页把验证码和token值获取出来 login_url = "https://so.gushiwen.org/user/login.aspx?from=http://so.gushiwen.org/user/collect.aspx?type=m" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36', 'Referer': 'https://so.gushiwen.org/user/login.aspx?from=http://so.gushiwen.org/user/collect.aspx?type=m' } # 访问登录页 # login_html = requests.get(url=login_url,headers=headers) # requests无法保存cookie s = request…

5.懒加载及自动化测试框架
type: item
date: 2019-07-26T21:21:00+08:00
description: 懒加载技术：用的时候再加载懒加载的要点如下：图片进入可视区域之后请求图片资源；对于电商等图片较多，页面很长的业务场景很适用；可以减少无效资源的加载；并发加载的资源过多会阻塞js的加载，影响网站的正常使用；常见的图片懒加载形式：src == src2案例：http://sc.chinaz.com/tupian/xingganmeinvtupian.html 获取图片，保存本地import urllib.request import urllib.parse from lxml import etree import os headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36', } def get_request(url,page): #1.处理url：url中需要携带页码值（第一页和非第一页的url是不同的） if page==1: url=format(url%'') else: pn='_'+str(page) url=format(url%pn) return urllib.request.Request(url,headers=headers) def download_images(image_url_list): dir_name='性感美女集' #在当前目录创建一个文件夹 if not os.path.exists(dir_name): os.mkdir(dir_name) for image_url in image_url_list: #通过url获取了图片的二进制数据值 request=urllib.request.Request(image_url,headers=headers) image_data=urllib.request.urlopen(request).read() image_name=os.path.basename(image_url) path=os.path.join(dir_name,image_name) with open(path,'wb') as fp: fp.write(image_data) start_page=int(input('enter start page num:')) end_page=int(input('enter end page num:')) url='http://sc.chinaz.com/tupian/xingganmeinvtupian%s.html' for page in range(start_page,end_page+1): request=get_request(url,page)#获取一个自定义的请求对象 response=urllib.request.urlopen(request) content=response.read().decode()#获取响应回来的网页源码数据 tree=etree.HTML(content) image_url_list=tree.xpath('//div[@id="container"]//img/@src2') download_images(image_url_list)#下载图片selenium（浏览器自动化测试框架）selenium是什么？ 是一个Python的一个第三方库，对外提供的接口可以操作你的浏览器，然后让浏览器完成自动化的操作使用selenium安装：pip install selenium操作谷歌浏览器，首先必须有谷歌浏览器的一个驱动除了谷歌，该模块也支持其他的一些主流浏览器，比如IE，Firefox等，但是需要对应的驱动谷歌驱动chromedriver下载地址1谷歌驱动chromedriver下载地址2谷歌驱动和谷歌浏览器版本关系映射表chromedriver版本支持的Chrome版本v2.41v67-69v2.40v66-68v2.39v66-68v2.38v65-67v2.37v64-66v2.36v63-65v2.35v62-64v2.34v61-63v2.33v60-62v2.32v59-61v2.31v58-60v2.30v58-60v2.29v56-58v2.28v55-57v2.27v54-56v2.26v53-55v2.25v53-55v2.24v52-54v2.23v51-53v2.22v49-52v2.21v46-50v2.20v43-48v2.19v43-47v2.18v43-46v2.17v42-43v2.13v…

4.常用的数据解析方式
type: item
date: 2019-07-26T09:57:00+08:00
description: 正则表达式解析单字符： . : 除换行以外所有字符 [] ：[aoe][a-w] 匹配集合中任意一个字符 \d ：数字 [0-9] \D : 非数字 \w ：数字、字母、下划线、中文 \W : 非\w \s ：所有的空白字符包,括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 \S : 非空白 数量修饰： * : 任意多次 >=0 + : 至少1次 >=1 ? : 可有可无 0次或者1次 {m} ：固定m次 hello{3,} {m,} ：至少m次 {m,n} ：m-n次 边界： $ : 以某某结尾 ^ : 以某某开头 分组：(ab) 贪婪模式：.* 非贪婪（惰性）模式：.*? re.I : 忽略大小写 re.M ：多行匹配 re.S ：单行匹配 re.sub(正则表达式, 替换内容, 字符串) 综合练习1 -- 图片下载糗事百科 需求：将指定页的图片下载后保存到指定文件夹中import urllib.request import urllib.parse import os import re s_pageNum=int(input('enter start page num:')) e_pageNum=int(input('enter end page num:')) #创建文件夹 if not os.path.exists('qiutu'): os.mkdir('qiutu') def get_request(url): headers={ 'User-Agent': 'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36' } return urllib.request.Request(url,headers=headers) def analysis_contente(content): url_list=[] #该列表是用来存储被拼接好的完整的图片的url pl=' .*? .*? ' pa=re.compile(pl,re.S) #该列表中存储就是当前页中所有的图片的url imageUrl_list=pa.findall(content) for n_url in imageUrl_list: url='https:'+n_url url_list.append(url) return url_list for page in range(s_pageNum,e_pageNum+1): url='https://www.qiushibaike.com/pic/page/%s/?s=5116392' url=format(url%str(page)) request=get_request(url) response=urllib.request.urlopen(request) content=response.read().decode() #对请求到的网页源码进行指定内容的解析 image_url_list=analysis_contente(content) for url in image_url_list: request_image=get_request(url) response_image=urllib.request.urlopen(request_image) #获取图片原有的名称 image_name=url.split('/')[-1] image_path='qiutu/'+image_name #将图片写入本地进行存储 with open(image_path,'wb') as fp: fp.write(response_image.read()) 综合练习2 -- 抓取文章#http://www.yikexun.cn/rensheng/ganwu/list_52_1.html import re, urllib.request, urllib.parse, os start = int(input('enter a start page:')) end = int(input('enter a end page:')) #新建文件夹 if not os.path.exists('一点点语录'): os.mkdir('一点点语录') #返回一个响应 def get_request(url): headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHT…

3.登录相关、代理
type: item
date: 2019-07-26T09:51:00+08:00
description: URLErrorURLError是HTTPError的父类型：出现URLError的错误原因：没有网服务器连接失败找不到指定的服务器import urllib.request import urllib.error url = 'http://www.basjdfkjgkfjgfjhd.com.cn' try: re = urllib.request.urlopen(url) print('here') except urllib.error.URLError as e: print(e.reason) # [Errno 11001] getaddrinfo failedHandler处理器、自定义Opener高级功能的处理：使用代理和cookie#向百度发起一个请求 url='http://www.baidu.com/' #1.创建一个Handler处理器对象 handler=urllib.request.HTTPHandler() #2,通过处理器对象生成一个Opener对象 opener=urllib.request.build_opener(handler) #opener作用：发起请求 request=urllib.request.Request(url) response=opener.open(request) print(response.read()) # <http.client.HTTPResponse at 0x7dbd780>代理生活：中介，代购程序： 正向代理：代理客户端获取数据 反向代理：代理服务器提供数据#使用代码的形式设置客户端代理 #创建处理器对象 handler=urllib.request.ProxyHandler(proxies={'http':'112.95.224.58:80'}) #2。创建opener对象，然后使用该对象发起一个请求 opener=urllib.request.build_opener(handler) url='https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=IP&oq=%25E8%25A5%25BF%25E5%2588%25BA%25E4%25BB%25A3%25E7%2590%2586&rsv_pq=fee3639900007be7&rsv_t=0d8cHJ8skuhEa3sCpORP%2FnTD7xO8gLUHq1Azm%2FXGJmqWlTIM3GuMWBSzjTg&rqlang=cn&rsv_enter=1&inputT=1271&rsv_sug3=12&rsv_sug1=6&rsv_sug7=100&rsv_sug2=0&rsv_sug4=1271' response=opener.open(url) with open('./daili.html','wb') as fp: fp.write(response.read())cookiecookie是什么？http协议，无状态网站登录时候的时候，用来记录用户身份的#模拟登陆-cookie #人人网案例：进入需要登录才可以访问的网页，则可以带着cookie值进行访问 url='http://www.renren.com/289676607/profile' headers={ "Cookie": "anonymid=jl1x24dy-u0udsq; depovince=BJ; _r01_=1; __utma=151146938.1794929042.1534809369.1534809369.1534809369.1; __utmz=151146938.1534809369.1.1.utmcsr=renren.com|utmccn=(referral)|utmcmd=referral|utmcct=/; _de=0832477C7D3BDE6C8C7E21AC68FA766C7DE1374C26B60001; ln_uact=www.zhangbowudi@qq.com; ln_hurl=http://hdn.xnimg.cn/photos/hdn221/20120418/1315/h_main_0Rbs_563500058dec2f76.jpg; jebe_key=626a9db1-7655-44f4-a1f2-6f69b1e0e681%7C55b0a29313d4d905d984b3769dc164d4%7C1534809469266%7C1%7C1534809477953; jebecookies=56edc7c2-4deb-4e27-8742-b6393274dfc7|||||; JSESSIONID=a…

2.根据不同请求爬取数据(get、post)
type: item
date: 2019-07-18T17:33:00+08:00
description: urllib库urllib：python自带的一个包。模拟浏览器发送请求Python2：urllib2 urllibPython3：urllib.parse urllib.request#最简单的爬虫程序 #1.指定一个url #2.编写爬虫程序模拟浏览器发起一个请求 #3.获取数据，解析数据 import urllib.request import urllib.parse url='http://www.baidu.com/' response=urllib.request.urlopen(url) #HTTPResponse:响应对象类型 data=response.read() #获取响应回客户端的数据值（bytes） data=data.decode() print(data)import urllib.request import urllib.parse url='http://www.baidu.com/' response=urllib.request.urlopen(url) #response.getcode() #状态码 #response.getheaders() #请求头信息 response.geturl() #网址#将响应会的数据值写入磁盘进行存储 url='http://www.baidu.com/' response=urllib.request.urlopen(url) #HTTPResponse:响应对象类型 data=response.read().decode() #获取响应回客户端的数据值（bytes） with open('./test/baidu.html','w') as fp: fp.write(data)保存图片方式一：#忽略证书:如果爬虫程序发起的是一个https请求，则必须执行如下代码进行证书的忽略 import ssl ssl._create_default_https_context = ssl._create_unverified_context #图片，音频，视频 必须为二进制类型 image_url='https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1534761981365&di=fa19817d15b6234ce5735d5007a95367&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimgad%2Fpic%2Fitem%2F21a4462309f79052b0ac781007f3d7ca7bcbd568.jpg' image_response=urllib.request.urlopen(image_url) image_data=image_response.read() with open('./test/data.jpg','wb') as fp: fp.write(image_data)方式二：#保存图片数据的第二种方式 url='https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1534825530753&di=3d46bfef5943bbed7b4301bc198cfc2e&imgtype=0&src=http%3A%2F%2Fwww.qqma.com%2Fimgpic2%2Fcpimagenew%2F2018%2F4%2F5%2F6e1de60ce43d4bf4b9671d7661024e7a.jpg' urllib.request.urlretrieve(url=url,filename='tupian.jpg') # ('tupian.jpg', <http.client.HTTPMessage at 0x6166978>)url特性：url必须为ascii编码（字母，数字，符号）。url必须由字母，数字，下划线或者符号组成。urllib.parse.quote()#urllib.parse.quoteu() 可以将非ASCII的字符编码成ASCII urllib.parse.quote('人民币') #注意：如果使用quote的话，该函数只可以为url中非ASCII的字符进行编码 ## %E4%BA%BA%E6%B0%91%E5%B8%81url='https://www.baidu.com/s?ie=utf-8&wd=%s' wd=urllib.parse.quote('人民币') url=format(url%wd) #接下来就可以对url发起一个请求urllib.parse.urlencode()#制定爬去…

1.爬虫入门了解
type: item
date: 2019-07-18T00:00:00+08:00
description: 爬虫概念什么是爬虫？概念：编写程序去互联网上爬取数据的过程哪些语言可以实现爬虫？javaphpc/c++python：提供了无限的模块爬虫的分类聚焦爬虫：“抓取系统”通用爬虫：根据制定的需求获取网页中制定的数据值问题：爬虫程序如何获取网站中的数据值？主动提交url搜索引擎公司会和DNS服务商进行合作robots.txt：口头的协议。如果门户网站指定了该协议后，表示该门户拒绝搜索引擎和爬虫程序爬去网站中的数据。http协议附：HTTP教程什么是http协议？服务器和客户端之间传输数据的一种形式HTTP 工作原理？HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器有：Apache服务器，IIS服务器（Internet Information Services）等。Web服务器根据接收到的请求后，向客户端发送响应信息。HTTP默认端口号为80，但是你也可以改为8080或者其他端口。HTTP三点注意事项：HTTP是无连接：无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求，并收到客户的应答后，即断开连接。采用这种方式可以节省传输时间。HTTP是媒体独立的：这意味着，只要客户端和服务器知道如何处理的数据内容，任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。HTTP是无状态：HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息，则它必须重传，这样可能导致每次连接传送的数据量增大。另一方面，在服务器不需要先前信息时它的应答就较快。一个http请求都包含什么？请求行：上图中的1,2,3请求头：请求体：learn-url常用的请求头： Accept-charsets：浏览器支持的字符类型get 和post请求：GET产生的URL地址可以被Bookmark，而POST不可以。GET请求会被浏览器主动cache，而POST不会，除非手动设置。GET请求只能进行url编码，而POST支持多种编码方式。GET请求参数会被完整保留在浏览器历史记录里，而POST中的参数不会被保留。GET请求在URL中传送的参数是有长度限制的，而POST么有。对参数的数据类型，GET只接受ASCII字符，而POST没有限制。GET比POST更不安全，因为参数直接暴露在URL上，所以不能用来传递敏感信息。GET参数通过URL传递，POST放在Request body中。https协议？HTTPS（全称：Hyper Text Transfer Protocol over Secure Socket Layer），是以安全为目标的HTTP通道，简单讲是HTTP的安全版。即HTTP下加入SSL层，HTTPS的安全基础是SSL，因此加密的详细内容就需要SSL。sslhttps和http的区别？超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容，不提供任何方式的数据加密，如果攻击者截取了Web浏览器和网站服务器之间的传输报文，就可以直接读懂其中的信息，因此HTTP协议不适合传输一些敏感信息，比如信用卡号、密码等。为了解决HTTP协议的这一缺陷，需要使用另一种协议：安全套接字层超文本传输协议HTTPS。为了数据传输的安全，HTTPS在HTTP的基础上加入了SSL协议，SSL依靠证书来验证服务器的身份，并为浏览器和服务器之间的通信加密。HTTPS和HTTP的区别主要为以下四点：(1)、https协议需要到ca申请证书，一般免费证书很少，需要交费。(2)、http是超文本传输协议，信息是明文传输，https 则是具有安全性的ssl加密传输协议。(3)、http和https使用的是完全不同的连接方式，用的端口也不一样，前者是80，后者是443。(4)、http的连接很简单，是无状态的；HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议，比http协议安全。fiddler什么是fiddler？专业的抓包工具，青花瓷配置：配置可以抓取https请求的操作有些浏览器也自带抓包工具fiddler的基本使用：右上：请求区域header：请求的头信息（UA，cookie）WebForms：请求对象中夹带的数据值Raw：请求对象中主要的详情json：接口XML：接口右下：响应区域