爬虫

一.markdown格式

常用语法

最常见的Markdown格式选项和键盘快捷键 [3] :

输出后的效果Markdown快捷键
Bold text Ctrl/⌘ + B
Emphasize text Ctrl/⌘ + I
Link title Ctrl/⌘ + K
Inline Code code Ctrl/⌘ + Shift + K
Image   Ctrl/⌘ + Shift + I
List * item Ctrl + L
Blockquote > quote Ctrl + Q
H1 # Heading  
H2 ## Heading Ctrl/⌘ + H
H3 ### Heading Ctrl/⌘ + H (x2)

 

标题

标题能显示出文章的结构。行首插入1-6个 # ,每增加一个 # 表示更深入层次的内容,对应到标题的深度由 1-6 阶。

  • H1 :# Header 1

  • H2 :## Header 2

  • H3 :### Header 3

  • H4 :#### Header 4

  • H5 :##### Header 5

  • H6 :###### Header 6

 

文本样式

(带“*”星号的文本样式,在原版Markdown标准中不存在,但在其大部分衍生标准中被添加)

  • 链接 :Title

  • 加粗 :*Bold*

  • 斜体字 :*Italics*

  • *高亮 :==text==

  • 段落 : 段落之间空一行

  • 换行符 : 一行结束时输入两个空格

  • 列表 :* 添加星号成为一个新的列表项。

  • 引用 :> 引用内容

  • 内嵌代码 : alert('Hello World');

  • 画水平线 (HR) :--------

  • 方框:- [ ] -

 

图片

使用Markdown将图像插入文章,你需要在Markdown编辑器输入 。 这时在预览面板中会自动创建一个图像上传框。你可以从电脑桌面拖放图片(.png, .gif, .jpg)到上传框, 或者点击图片上传框使用标准的图像上传方式。 如果你想通过链接插入网络上已经存在的图片,只要单击图片上传框的左下角的“链接”图标,这时就会呈现图像URL的输入框。想给图片添加一个标题, 你需要做的是将标题文本插图中的方括号,e.g;.

 

脚注

脚注不存在于标准Markdown中。

使用这样的占位符号可以将脚注添加到文本中:1. 另外,你可以使用“n”而不是数字的n所以你可以不必担心使用哪个号码。在您的文章的结尾,你可以如下图所示定义匹配的注脚,URL将变成链接:

`这里是脚注[^1]``[^1]: 这里是脚注的内容` `这里是脚注[^n]``[^n]: 这里是脚注的内容`

 

写代码

添加内嵌代码可以使用一对回勾号 alert('Hello World').对于插入代码, Ghost支持标准的Markdown代码和GitHub Flavored Markdown (GFM) [4] 。标准Markdown基于缩进代码行或者4个空格位:

`   ``<``header``>    ``   ``<``h1``>{{title}}</``h1``>``   ``</``header``>`

GFM 使用三个回勾号```

`´´´``<``header``>``    ``<``h1``>{{title}}</``h1``>``</``header``>`

层级

用'-'和缩进控制

 

二.jupyter应用:基于浏览器的可视化工具

注:需要anaconda 集成环境

1.快捷键

Shift+Enter : 运行本单元,选中下个单元
Ctrl+Enter : 运行本单元
Alt+Enter : 运行本单元,在其下插入新单元
shift+tab : 打开帮助文档
Y:单元转入代码状态
M:单元转入markdown状态
A :在上方插入新单元
B:在下方插入新单元
X:剪切选中的单元
Shift +V:在上方粘贴单元

2.可视化工具的运行

选择 jupyter

默认浏览器会直接启动(或输入jupyter notebook 启动)

得到可视化工具页面

3.代码只要在同一个原文件中就可以,没有上下之分

注:等号前要有空格

 

三.爬虫

1.定义

通过编写程序,模拟浏览器上网,让其去互联网上爬取数据的过程

2.分类

- 通用爬虫 :常用于搜索引擎中
- 聚焦爬虫 :爬取局部数据
- 增量式 :只爬取最新的内容

3.反爬机制

##反爬机制一

robots.txt协议:第一个反爬机制,一个网站约束了什么数据可爬,什么数据不可爬

4.folder:软件形式的抓包工具

打开(双击)

配置

选择tools中的options

https配置

重启fiddler

功能

请求头信息

当前请求所携带的参数

响应头信息

响应的json数据

向右箭头代表post请求,向左代表get请求

 

5.http和https协议

常用的请求头信息

User-Agent:请求载体的身份标识
Connection:close/keep alive #连接的状态

常用的相应头信息

Content-Type:告诉浏览器返回的数据类型

 

四.requests模块的使用

1.request模块代码编写流程

1.指定url
2.发起请求
3.获取相应对象中的数据
4.持久化存储

2.抓取搜狗指定词条相关页面

import requests
url='https://www.sogou.com/web'
content=input("请输入搜索内容:")
params={
   "query":content
}
#指定url,发起请求
response=requests.get(url=url,params=params).text#获取相应对象中的数据
with
#持久化存储open('./sogou.html','w',encoding='utf-8') as f:
   f.write(response)
print("爬取完成!!!")

注:不同参数的数据格式

.txt #以字符串形式存储
.content #存储二进制数据
.json() #获取json字符串

 

3.抓取百度翻译相关页面

import requests
url='https://fanyi.baidu.com/sug'
content=input("请输入翻译内容:")
params={
   "kw": content
}
response=requests.get(url=url,params=params).json()
print(response)
print("爬取完成!!!")

#结果
请输入翻译内容:美少女
{'errno': 0, 'data': [{'k': '美少女', 'v': 'beautiful young girl;nymph;'}, {'k': '美少女战士', 'v': 'Sailor Moon;'}]}
爬取完成!!!

 

4.抓取豆瓣电影数据

import requests
url='https://movie.douban.com/j/chart/top_list'
params={
   "type": "5",
   "interval_id": "100:90",
   "action":"",
   "start": "1",
   "limit": "100"
}
response=requests.get(url=url,params=params).json()
print(response)
print("爬取完成!!!")

 

5.获取肯德基指定地点餐厅数量信息

import requests
url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
content=input("请输入要查询的地址:")
params={
   "cname": "",
   "pid": "",
   "keyword": content,
   "pageIndex": "1",
   "pageSize": "10",
}
response=requests.get(url=url,params=params).json()
print(response)
#结果
#请输入要查询的地址:北京
{'Table': [{'rowcount': 69}], 'Table1': [{'rownum': 1, 'storeName': '育慧里', 'addressDetail': '小营东路3号北京凯基伦购物中心一层西侧', 'pro': 'Wi-Fi,店内参观,礼品卡', 'provinceName': '北京市', 'cityName': '北京市'}, {'rownum': 2, 'storeName': '京通新城', 'addressDetail': '朝阳路杨闸环岛西北京通苑30号楼一层南侧', 'pro': 'Wi-Fi,店内参观,礼品卡,生日餐会', 'provinceName': '北京市', 'cityName': '北京市'}, {'rownum': 3, 'storeName': '黄寺大街', 'addressDetail': '黄寺大街15号北京城乡黄寺商厦', 'pro': 'Wi-Fi,店内参观,礼品卡,生日餐会', 'provinceName': '北京市', 'cityName': '北京市'}, {'rownum': 4, 'storeName': '四季青桥', 'addressDetail': '西四环北路117号北京欧尚超市F1、B1', 'pro': 'Wi-Fi,店内参观,礼品卡,生日餐会', 'provinceName': '北京市', 'cityName': '北京市'}, {'rownum': 5, 'storeName': '亦庄', 'addressDetail': '北京经济开发区西环北路18号F1+F2', 'pro': 'Wi-Fi,店内参观,礼品卡,生日餐会', 'provinceName': '北京市', 'cityName': '北京市'}, {'rownum': 6, 'storeName': '石园南大街', 'addressDetail': '通顺路石园西区南侧北京顺义西单商场石园分店一层、二层部分', 'pro': 'Wi-Fi,店内参观,礼品卡', 'provinceName': '北京市', 'cityName': '北京市'}, {'rownum': 7, 'storeName': '北京站广场', 'addressDetail': '北京站一层', 'pro': '礼品卡', 'provinceName': '北京市', 'cityName': '北京市'}, {'rownum': 8, 'storeName': '北京南站', 'addressDetail': '北京南站候车大厅B岛201号', 'pro': '礼品卡', 'provinceName': '北京市', 'cityName': '北京市'}, {'rownum': 9, 'storeName': '北清路', 'addressDetail': '北京北清路1号146区', 'pro': 'Wi-Fi,店内参观,礼品卡', 'provinceName': '北京市', 'cityName': '北京市'}, {'rownum': 10, 'storeName': '大红门新世纪肯德基餐厅', 'addressDetail': '海户屯北京新世纪服装商贸城一层南侧', 'pro': 'Wi-Fi,店内参观,礼品卡', 'provinceName': '北京市', 'cityName': '北京市'}]}

 

6.抓取生产许可证相关数据

##反爬机制二:User-Agent

import requests
id_list=[]
url='http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
headers={
   "User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'
}
page=input("查询几页:")
for i in range(1,int(page)+1):
   params={
   "on": "true",
   "page": i,
   "pageSize": "15",
   "productName": "",
   "conditionType": "1",
   "applyname": "",
   "applysn": "",
  }
   object_list=requests.post(url=url,params=params,headers=headers).json()["list"]
   for object in  object_list:
       id_list.append(object["ID"])
     
for id in id_list:
   url='http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
   params={
       "id": id
  }
   response=requests.post(url=url,params=params,headers=headers).json()
   print(response)

注:第二个反爬机制,UA反爬

反爬方式:模拟浏览器的useragent

 

7.爬取图片内容

方式一:通过requests模块

import requests
url='https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1695604879,3405317932&fm=26&gp=0.jpg'
response=requests.get(url=url).content        
with open('./meishaonv.jpg','wb') as f:
   f.write(response)
print('爬取完成!!!')  

方式二:通过urllib模块

import urllib
url='https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1695604879,3405317932&fm=26&gp=0.jpg'
urllib.request.urlretrieve(url=url,filename='meishaonv2.jpg')

 

五.数据解析

1.通过正则解析

(1)正则模块补充

re.M 多行匹配

import re
content='''
sadasf
sdgdfg
sdgfd
tghj
'''
re.findall("^s.*",content,re.M)
#['sadasf', 'sdgdfg', 'sdgfd']

re.S 整体作为一行匹配

import re
content='''
sadasf
sdgdfg
sdgfd
tghj
'''
re.findall("^.*",content,re.S)
#['\nsadasf\nsdgdfg\nsdgfd\ntghj\n']

re.I 忽略大小写

import re
content='''sadasf
sdgdfg
sdgfd
tghj
'''
re.findall("^S",content,re.I)

(2)爬取糗事百科中所有图片

import re
import requests
page=int(input('一共爬取几页:'))
url='https://www.qiushibaike.com/pic/page/%d/?s=5170625' % page
headers={
   "User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'
}

for pa in range(1,page+1):
   i=1
   url='https://www.qiushibaike.com/pic/page/%d/?s=5170625' % pa
   response_str=requests.get(url=url,headers=headers).text
   res_lis=re.findall('<div class="thumb">.*?<img src="(.*?)" alt=.*?</div>',response_str,re.S)
   
   for ip in res_lis:
       url="https:"+ip
       cont=requests.get(url=url,headers=headers).content
       addr='./tupian/'+str(i)+'.jpg'
       i+=1
       with open(addr,mode='wb') as f:
           f.write(cont)
print("爬取完成!!")  

 

2.通过bs4解析

(1)环境准备

pip3 install lxml #解析器
pip3 install bs4

(2)bs4的解析原理

1.将要进行解析的原码加载到bs对象
2.调用bs对象中相关的方法或属性进行原码中相关标签的定位
3.将定位到的标签之间存在的文本或属性值提取

(3)bs4的方法与属性

(1)根据标签名查找
soup.a 只能找到所有符合要求的标签第一个
(2)获取属性(值)
soup.a.attrs 获取a的所有属性和属性值,返回一个字典
soup.a.attrs['href'] 获取a的href属性值
soup.a["href"] 获取a的href属性值的简写
(3)获取内容
soup.a.string 获取a标签中直系文本数据
soup.a.text 获取a标签的非直系文本数据
soup.a.get_text() 同上
(4)找到第一个符合要求的标签
soup.find('a') 找到第一个a标签
soup.find('a',title='xxx')
soup.find('a',alt='xxx')
soup.find('a',class_='xxx')
soup.find('a',id='xxx')
(5)找到所有符合要求的标签
soup.find_all('a') 找到所有a标签
soup.find_all('a',title='xxx')
soup.find_all('a',alt='xxx')
soup.find_all('a',class_='xxx')
soup.find_all('a',id='xxx')
(6)根据选择器选择指定的内容(返回值永远是列表)
select:soup.select("#xxx")
常见选择器:
标签选择器:(a)
类选择器:(.)
id选择器:(#)
层级选择器:
div .dudu #gh .name
div>p>.acd>#hjk

(4)爬取诗词名句网的三国演义

import requests
from bs4 import BeautifulSoup
url='http://www.shicimingju.com/book/sanguoyanyi.html'
headers={
   "User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'
}

response_str=requests.get(url=url,headers=headers).text
soup=BeautifulSoup(response_str,'lxml')
title_list=soup.select('.book-mulu > ul > li > a')
with open('sanguoyanyi.txt','w',encoding='utf-8') as f:
   for title in title_list:
       title_str=title.string
       f.write(title_str)
       content_url='http://www.shicimingju.com'+title['href']

       content=requests.get(url=content_url,headers=headers).text
       soup=BeautifulSoup(content,'lxml')
       content_list=soup.select('.chapter_content > p')
       for cont in content_list:
           cont_str=cont.string
           f.write(cont_str)
f.close()            
print("爬取完成!!")  

 

 

 

 

posted @ 2019-03-20 15:24  ★行者尚★  阅读(572)  评论(1编辑  收藏  举报