在进行大数据的项目时,涉及到数据的采集工作,爬虫就是获取数据集的一个工具,本文记录了笔者学习爬虫的过程和总结,案例建议从第一个开始看。
看完这篇文章,想进一步了解的请移步
- python爬虫进阶——聚焦爬虫
以下是本篇文章正文内容,建议使用PyCharm等工具进行实践
文章目录
- 1 准备工作
-
- 1.1 python的编码规范
- 1.2 引入爬虫所需要的模块
- 2 requests模块
-
- 2.1 介绍
- 2.2 编码的四个流程
- 2.3 第一战:html页面爬取
- 2.4 第二战:简易的网页采集器
-
-
- UA伪装:User-Agent
-
- 2.5 第三战:破解百度翻译
- 2.6 第四战:爬取豆瓣电影分类排行榜中电影详细数据
- 2.7 第五战:爬取肯德基餐厅位置信息
- 2.8 第六战:爬取国家药监局化妆品许可证相关数据
1 准备工作
1.1 python的编码规范
1、python程序第一行加入
# coding = utf-8
2、在python中函数代码块以def关键词开头,后接空格、函数标识符、名称、圆括号、冒号,return用来结束函数,可以返回一个值,也可以不返回。
3、python文件中,加入main函数用于测试程序,表示程序的入口
(所有的调用都写在这里)
def main(): print("hello")
if __name__ == "__main__" : main()
1.2 引入爬虫所需要的模块
模块:第三方库
爬虫可能需要使用到模块如下:
import sys from bs4 import BeautifulSoup # 网页解析,获取数据 import re # 正则表达式,进行文字匹配的 import urllib.request,urllib.error # 制定URL,获取数据 import requests import xlwt # 进行excel操作,存储到excel import sqlite3 # 进行SQLite操作,存储到数据库
注:有些是python3自带的,有的需要自己使用pip安装
2 requests模块
2.1 介绍
是python中原生的一款基于网络请求的模块,功能强大、简单便捷、效率极高
作用:用来模拟浏览器发请求
2.2 编码的四个流程
共四个步骤,如下:
2.3 第一战:html页面爬取
1、 需求
爬取搜狗首页的页面数据
2、 编码
if __name__ == "__main__" : # 指定URL url = 'https://www.sogou.com/' # 发起请求 requests.get(url = url) # 获取响应对象 response = requests.get(url = url) # 获取响应数据,text返回的是字符串形式的响应数据 page_text = response.text # 持久化存储 with open('./sougou.html','w',encoding='utf-8') as fp: fp.write(page_text)
2.4 第二战:简易的网页采集器
1、 需求
爬取搜狗指定词条对应的搜索结果界面(简易的网页采集器)
UA伪装:User-Agent
User-Agent:请求载体的身份
UA伪装:门户网站的服务器会检测对应请求的载体身份标识,如果检测到请求的载体为某一款浏览器,但是不是浏览器的话则表示为不正常的请求(爬虫),则服务器会拒绝该次请求
因此,需要进行UA伪装
2、编码
if __name__ == "__main__" : # UA伪装 headers = { 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15' } # 指定URL url = 'https://www.sogou.com/web' # 处理url携带的参数,封装到字典中 kw = input('enter a word') param={ 'query':kw } # 发起请求,携带参数 requests.get(url = url,params=param) # 获取响应对象 response = requests.get(url = url,params=param,headers=headers) # 获取响应数据,text返回的是字符串形式的响应数据 page_text = response.text filename = kw+'.html' # 持久化存储 with open(filename,'w',encoding='utf-8') as fp: fp.write(page_text)
2.5 第三战:破解百度翻译
1、 需求
破解百度翻译
2、分析
- post请求(携带了参数)
- 响应数据是一组json数据
2、编码
import requests import json if __name__ == "__main__" : # 1、UA伪装 headers = { 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15' } # 2、指定URL post_url = 'https://fanyi.baidu.com/sug' # 3、post请求参数处理(同get请求) data = { 'kw':'dog' } # 4、发起请求,携带参数 requests.post(url=post_url,data=data,headers=headers) # 5、获取响应对象 response = requests.post(url = post_url,data=data,headers=headers) # 6、获取响应数据,json()返回的是一个对象 dic_obj = response.json() # 持久化存储 fp=open('./dog.json','w',encoding='utf-8') json.dump(dic_obj,fp=fp,ensure_ascii=False)
2.6 第四战:爬取豆瓣电影分类排行榜中电影详细数据
1、 需求
爬取豆瓣电影分类排行榜中电影详细数据,https://movie.douban.com/
2、分析
3、编码
import requests import json if __name__ == "__main__" : # 1、UA伪装 headers = { 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15' } # 2、指定URL url = 'https://movie.douban.com/j/chart/top_list' # 3、get请求参数处理 param = { 'type':'24', 'interval_id':'100:90', 'action':'', 'start':'0', # 表示从第1部电影开始 'limit':'20' # 一次取20部 } # 4、发起请求,携带参数 requests.get(url=url,params=param,headers=headers) # 5、获取响应对象 response = requests.get(url = url,params=param,headers=headers) # 6、获取响应数据,json()返回的是一个对象 dic_obj = response.json() # 持久化存储 fp=open('./movie.json','w',encoding='utf-8') json.dump(dic_obj,fp=fp,ensure_ascii=False)
2.7 第五战:爬取肯德基餐厅位置信息
1、 需求
爬取肯德基餐厅位置信息 ,http://www.kfc.com.cn/kfccda/index.aspx
2、编码
import requests import json if __name__ == "__main__" : # 1、UA伪装 headers = { 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15' } # 2、指定URL url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?opt:keyword' # 3、post请求参数处理 param = { 'cname': '', 'pid': '', 'keyword':'沈阳', 'pageIndex':'1' } # 4、发起请求,携带参数 requests.post(url=url,data=param,headers=headers) # 5、获取响应对象 response = requests.post(url = url,data=param,headers=headers) # 6、获取响应数据 page_text = response.text # 持久化存储 filename = 'sy.html' # 持久化存储 with open(filename,'w',encoding='utf-8') as fp: fp.write(page_text)
2.8 第六战:爬取国家药监局化妆品许可证相关数据
1、 需求
爬取国家药监局化妆品许可证相关数据
http://scxk.nmpa.gov.cn:81/xk/
我们所需要的是一家企业的详细信息,需要点进去,如下图所示:
2、分析
http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=39213f625bf8425a8e871fb5b15e1dfa
id就是json中的ID
3、编码
import requests import json if __name__ == "__main__" : # UA伪装 headers = { 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15' }
# 批量获取企业的id # 指定URL url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
all_data_list=[] # 存储企业的详细数据 id_list = [] # 存储id # 参数的封装 for page in range(1,362): page = str(page) data = { 'on': 'true', 'page': page, 'pageSize': '15', 'productName':'', 'conditionType': '1', 'applyname':'', 'applysn':'' } # 发起请求,携带参数 requests.post(url=url,headers=headers,data=data) # 获取响应对象 response = requests.post(url=url,headers=headers,data=data) # 获取响应数据 json_ids = response.json() # 取出id for dic in json_ids['list']: id_list.append(dic['ID'])
# 获取企业的详细信息 post_url='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById' for id in id_list: data={ 'id': id } detail_json=requests.post(url=post_url,headers=headers,data=data).json() all_data_list.append(detail_json)
# 持久化存储 fp = open('./allData.json','w',encoding='utf-8') json.dump(all_data_list,fp=fp,ensure_ascii=False)
友情提示:可能是361页过多,PyCharm会报错;换成十几页就没有问题,很奇怪
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试