欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【数据采集】半小时快速上手python爬虫(纯干货)

程序员文章站 2022-07-02 22:48:22
在进行大数据的项目时,涉及到数据的采集工作,爬虫就是获取数据集的一个工具,本文记录了笔者学习爬虫的过程和总结,案例建议从第一个开始看。以下是本篇文章正文内容,建议使用PyCharm等工具进行实践文章目录1 准备工作1.1 python的编码规范1.2 引入爬虫所需要的模块2 requests模块2.1 介绍2.2 编码的四个流程2.3 第一站:html页面爬取2.4 第二战:简易的网页采集器UA伪装:User-Agent2.5 第三战:破解百度翻译2.6 第四战:爬取豆瓣电影分类排行榜中电影详细数....

在进行大数据的项目时,涉及到数据的采集工作,爬虫就是获取数据集的一个工具,本文记录了笔者学习爬虫的过程和总结,案例建议从第一个开始看。

看完这篇文章,想进一步了解的请移步


以下是本篇文章正文内容,建议使用PyCharm等工具进行实践

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 编码的四个流程

共四个步骤,如下:

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

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、分析

  1. 滚轮拖动的时候会刷新新的一批电影
  2. get请求
  3. json格式
  4. url:https://movie.douban.com/j/chart/top_list

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/
【数据采集】半小时快速上手python爬虫(纯干货)
我们所需要的是一家企业的详细信息,需要点进去,如下图所示:
【数据采集】半小时快速上手python爬虫(纯干货)
2、分析

  1. 首页中每个企业对应着一个超级链接,链接到详细信息界面
  2. 经过测试,我们发现url设置为http://scxk.nmpa.gov.cn:81/xk/无法获取数据(可以自己试一下)
  3. 我们可以发现,有ajax请求,响应了json,如下图;因此可以得出结论:首页中的企业信息数据是通过ajax动态请求到的
  4. 因此,我们需要找到每一家企业详细信息所对应的链接地址,可以发现:
    http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=39213f625bf8425a8e871fb5b15e1dfa
    id就是json中的ID
  5. 观察每家企业的详细页的ajax请求后发现,所有的post的url是一样的,只有参数id不同,因此可以批量获取企业的id,将id和url形成一个完整的详情页对应

【数据采集】半小时快速上手python爬虫(纯干货)
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会报错;换成十几页就没有问题,很奇怪

本文地址:https://blog.csdn.net/qq_45650899/article/details/110448722