爬虫学习参考博客:https://www.cnblogs.com/cyycyhcbw/articles/10442399.html

1.使用软件anaconda

2.输入jupyter notbook 

3.anaconda使用快捷键

-插入cell:     a  上一行插入        b 下一行插入

-删除: x

-模式切换: m切换到master      y 切换到code

-执行cell:shift+enter

-tab

-打开帮助文档:shift+tab

4.爬虫概述

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

5.爬虫的分类:

  5.1通用爬虫:爬取一整张页面源码数据

  5.2聚焦爬虫:爬取页面中指定的局部数据

  5.3增量式爬虫:检测网站数据更新的情况,爬取的就是网站中最新的数据

6.反爬机制

7.反反爬策略

8.第一个反爬机制:robots.txt协议

二:requests模块的应用

-requests:功能强大,操作简单

-urllib

-作用:用来模拟浏览器发请求

-编码流程

  -指定url

  -发起请求:requests.get/post

  -获取响应数据

  -持久化存储

#爬取搜狗首页的源码数据
import requests

#1.
url="https://www.sogou.com/"
#2.
response=requestes.get(url=url)
#3.
page_text=response.text
#4.
with open('/sougou.html','w',encoding='utf-8') as fp:
    fp.write(page_text)

 

 爬虫第一天

 

#简易的网页采集器
wd=input('enter a word')
#1.
url="https://www.sogou.com/web?"
#2.将请求参数设定为动态的
param={
    "query":wd
}
#3.params传参
response=requests.get(url=url,params=param)
#4.手动设置响应数据的编码,处理中文乱码问题
response.encoding='utf-8'
#5.text返回的是字符串形式的响应数据
page_text=response.text

filename=wd+'.html'

with open(filename,'w',enconding='utf-8') as fp:
    fp.write(page_text)


#打开页面会出现以下错误,这是网站的反爬机制
#用户您好,我们的系统检测到您网络中存在异常访问请求。
#此验证码用于确认这些请求是您的正常行为而不是自动程序发出的,需要您协助验证。

 

 User-Agent:请求载体的身份标识

UA检测:门户网站的服务器端会检测每一个请求的UA,如果检测到请求的UA为爬虫程序,则请求失败

UA伪装:

爬虫第一天

 

#简易的网页采集器
wd=input('enter a word')
#1.
url="https://www.sogou.com/web?"
#2.将请求参数设定为动态的
param={
    "query":wd
}
#UA伪装
headers={
    "User-Agent":'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
}
#3.params传参
response=requests.get(url=url,params=param,headers=headers)
#4.手动设置响应数据的编码,处理中文乱码问题
response.encoding='utf-8'
#5.text返回的是字符串形式的响应数据
page_text=response.text

filename=wd+'.html'

with open(filename,'w',encoding='utf-8') as fp:
    fp.write(page_text)

 爬虫第一天

爬虫第一天

 爬虫第一天

 爬虫第一天

 

#爬取肯德基餐厅位置信息(有关于ajax刷新页面的数据采集)
url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
#动态生成城市
city=input('enter a city name:')
data={
    'cname': '',
    'pid': '',
    'keyword': city,
    'pageIndex': '1',
    'pageSize': '10',
}
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
}
response=requests.post(url=url,data=data,headers=headers)

page_text=response.json()
print(page_text)

#这里文件操作可以覆盖写入,也可以追加写入

fp=open('/kfc.text','w',encoding='utf-8')


for dic in page_text['Table1']:
    addr=dic['addressDetail']
print(addr)
    fp.write(addr+'\n')
fp.clouse()
  •  爬取动态加载的页面数据

爬虫第一天

爬虫第一天

 

#爬取豆瓣电影的电影详情数据
url='https://movie.douban.com/j/chart/top_list'
s =1
limit=100
param={
    'type': '5'
    'interval_id': '100:90'
    'action':'' 
    'start': s
    'limit': limit
}
response=requests.get(url=url,headers=headers,params=param)

page_text=response.json()

 爬取药监局相关的数据http://125.35.6.84:81/xk/

  • 发现首页中的所有的企业数据都是动态加载出来的
  • 通过抓包工具捕获动态加载数据对应的数据包
  • 从上一步的数据包对应的响应数据中提取到企业的相关信息(ID)
  • 通过分析每一家企业详情页面的url发现,所有的详情页的url域名都是一样的,只有id不同
  • 可以通过获取每一家企业的id结合着固定的域名拼接成详情页的url
  • 对url发起请求就可以获取企业详情数据

爬虫第一天

爬虫第一天

爬虫第一天

 

爬虫第一天

爬虫第一天

爬虫第一天

#爬取药监局相关的数据http://125.35.6.84:81/xk/
url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
data = {
    "on": "true",
    "pageSize": "15",
    "productName": "",
    "conditionType": "1",
    "applyname": "",
    "applysn": "",
}
page_text = requests.post(url=url,headers=headers,data=data).json()

for dic in page_text['list']:
    _id = dic['ID']
  #拿到ID后发现详情页面也是动态加载的,所以上面的步骤要重新来一遍,就可以拿到详情页面的数据了,注意请求方式为post detail_url
= 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById' data = { 'id':_id } detail_data = requests.post(url=detail_url,headers=headers,data=data).json() print(detail_data)

 爬取图片

  •  content返回的是二进制byte形式的响应数据
  •  两种方法:1是用requests,2是用urllib
#如何爬取图片
url = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1560235823355&di=4f6c6ad96539247edda08e7ad09f0dee&imgtype=0&src=http%3A%2F%2Fgss0.baidu.com%2F-fo3dSag_xI4khGko9WTAnF6hhy%2Fzhidao%2Fpic%2Fitem%2Fadaf2edda3cc7cd9e3670adb3901213fb80e916d.jpg'
#content返回的是二进制bytes形式的响应数据
img_data = requests.get(url=url,headers=headers).content

with open('./123.jpg','wb') as fp:
    fp.write(img_data)
from urllib import request
url = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1560235823355&di=4f6c6ad96539247edda08e7ad09f0dee&imgtype=0&src=http%3A%2F%2Fgss0.baidu.com%2F-fo3dSag_xI4khGko9WTAnF6hhy%2Fzhidao%2Fpic%2Fitem%2Fadaf2edda3cc7cd9e3670adb3901213fb80e916d.jpg'

request.urlretrieve(url=url,filename='./456.jpg')

 

 http协议:client和server进行数据交互的形式

https协议:http加密后

参考https://www.cnblogs.com/bobo-zhang/p/9645715.html

 ------------------------------------------------------------------------------------------------------------------------------------

回顾总结:

爬虫的分类:

  通用爬虫:爬取一整个页面

  聚焦爬虫:爬取页面的某一部分

  增量式爬虫:对新增内容的爬取

requests的使用

  作用:模拟浏览器发请求

  get/post:参数url params/data,headers

  反爬机制:

    robots:不需要做任何事情,直接可以爬取

    UA检测:UA伪装   User-Agent

  编码流程:

    指定url  

    发起请求

    获取响应数据

    持久化存储

  get/post返回值:响应对象response

    text:字符串形式的响应数据

    json():返回的是标准的json数据,也就是字典

    content:二进制形式的响应数据

    encoding:响应数据的编码