Python爬虫

关注公众号“轻松学编程”了解更多。

大纲:

1、获取响应
urllib(python3)/urllib2-urllib(python2)

requests(urllib3) --get/post

2、解析响应
HTML、json
re/bs4/xpath(描述性语句)

3、通用动态数据加载 selenium(自动化测试框架) + phantomJS(无界面浏览器)、handles

4、scrapy框架
高性能(多线程-10条、并发-16的框架)、高定制(爬虫)
提供了数据的下载、解析(xpath)、持久化

5、scrapy-redis(分布式策略)
核心–redis-组件(一主多从) —在redis实现任务分配、指纹去重
根本–scrapy

6、解决的问题
反反爬虫(爬虫工程师)
反爬虫(对web后端–Django中间件)

一、urllib2库的基本使用

所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。 在Python中有很多库可以用来抓取网页,我们先学习urllib2。

urllib2 是 Python2.7 自带的模块(不需要下载,导入即可使用)

urllib2 官方文档:https://docs.python.org/2/library/urllib2.html

urllib2 源码:https://hg.python.org/cpython/file/2.7/Lib/urllib2.py

urllib2 在 python3.x 中被改为urllib.request

import urllib2
import urllib headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"} def baiduAPI(wd):
'''
百度接口
:return:response
'''
# url编码,多个参数,按字典格式写,自动拼接&
wd = urllib.urlencode({"wd": wd, "rsv_spt": "1"}) url = 'https://www.baidu.com/s?' + wd
print url
request = urllib2.Request(url, headers=headers)
respose = urllib2.urlopen(request) return respose.read() if __name__ == '__main__':
kw = raw_input("请输入搜索关键字:")
response = baiduAPI(kw)
print response

二、urllib

1、简介

官方文档地址:https://docs.python.org/3/library/urllib.html

Urllib是python内置的HTTP请求库,提供了一系列用于操作URL的功能。

包括以下模块 :

urllib.request 请求模块

urllib.error 异常处理模块

urllib.parse url解析模块

urllib.robotparser robots.txt解析模块

urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应。

2、urlopen

######2.1 参数介绍:

urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
*, cafile=None, capath=None,
cadefault=False, context=None):

常用参数有3个:

url:请求体(包含请求地址、代理等信息);

data:如果添加data参数就是以post请求方式请求,如果没有data参数就是get请求方式 ;

timeout:请求时间

######2.2 返回值:

# 向指定的url发送请求,返回一个类文件对象,支持python文件操作
read() #全部读取
readlines() #以行方式全部读取
readline() #读取一行
2.3 例子

获取get请求


import urllib.request header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
} '''
url, data=None, 获取get请求
headers={} 请求头
'''
req = urllib.request.Request('https://www.baidu.com', headers=header) # 请求体
print(req.get_header('User-agent')) # 第一个必须大写,其余必须小写
response = urllib.request.urlopen(req) # 发送请求
print(response.read().decode())

获取post请求:

post请求一般用于Form表单,可以封装成一个字典,放在urllib.request.Request()中,返回一个请求体。

从浏览器中获取一个form-data数据

把复制的数据放到sublime编辑器中,使用正则表达式替换为json格式:

查找->替换
正则表达式为:
^(.*):(.*)$
"\1":"\2",

import urllib
import json from urllib import request, parse
#请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"} def getJobTotalPage(kw):
'''
获取相关岗位总页数
:param kw: 岗位名
:return: 总页数
''' # 种子
url = "https://job.alibaba.com/zhaopin/socialPositionList/doList.json"
# 表单数据
data = {
"pageSize": "10",
"t": "0.24795042432579706",
"keyWord": kw,
"location": "",
"second": "",
"first": "",
"pageIndex": "1"
}
# url编码
data = urllib.parse.urlencode(data).encode('utf-8')
# 请求,data=data表明是POST请求
req = urllib.request.Request(url, data=data, headers=headers)
# 获取响应
response = urllib.request.urlopen(req).read().decode('utf-8')
# 转json
data = json.loads(response)
# 获取岗位数量
totlPage = data['returnValue']['totalPage']
return int(totlPage) def getJobInfo(kw, pagenum):
'''
获取岗位数量
:param kw: 搜索关键字
:param pagenum: 总页面数量
:return: 岗位信息
'''
url = "https://job.alibaba.com/zhaopin/socialPositionList/doList.json"
# 根据岗位类型抓取全部页面数据
for i in range(1, pagenum + 1):
data = {
"pageSize": "10",
"t": "0.24795042432579706",
"keyWord": kw,
"location": "",
"second": "",
"first": "",
"pageIndex": i
}
# url编码
data = urllib.parse.urlencode(data).encode('utf-8') # POST data should be bytes
'''
url, data=None, headers={}
'''
req = urllib.request.Request(url, data=data, headers=headers) # POST请求
response = urllib.request.urlopen(req).read().decode('utf-8')
# print(response) # 转json
data = json.loads(response)
# 获取job列表
jobList = data['returnValue']['datas']
# print(jobList) # 提取岗位详细信息
for job in jobList:
# 学历
degree = job['degree']
# 部门
departmentName = job['departmentName']
# 描述
description = job['description'].replace('<br/>', '')
# 技术分类
firstCategory = job['firstCategory']
# 岗位名
name = job['name']
# 要求
requirement = job['requirement'].replace('<br/>', '')
print(degree, departmentName, description, requirement) if __name__ == '__main__':
# 岗位列表
jobList = ['python', 'java'] for job in jobList:
totlPage = getJobTotalPage(job)
print(totlPage) getJobInfo(job, totlPage)
3、User-Agent

######3.1 简介

有一些网站不喜欢被爬虫程序访问,所以会检测连接对象,如果是爬虫程序,也就是非人点击访问,它就会不让你继续访问,所以为了要让程序可以正常运行,需要隐藏自己的爬虫程序的身份。此时,我们就可以通过设置User Agent的来达到隐藏身份的目的,User Agent的中文名为用户代理,简称UA。

User Agent存放于Headers中,服务器就是通过查看Headers中的User Agent来判断是谁在访问。在Python中,如果不设置User Agent,程序将使用默认的参数,那么这个User Agent就会有Python的字样,如果服务器检查User Agent,那么没有设置User Agent的Python程序将无法正常访问网站。

######3.2 常用消息头(详解http请求消息头)

  • Accept:text/html,image/*(告诉服务器,浏览器可以接受文本,网页图片)
  • Accept-Charaset:ISO-8859-1 [接受字符编码:iso-8859-1]
  • Accept-Encoding:gzip,compress[可以接受 gzip,compress压缩后数据]
  • Accept-Language:zh-cn[浏览器支持的语言]
  • Host:localhost:8080[浏览器要找的主机]
  • Referer:http://localhost:8080/test/abc.html[告诉服务器我来自哪里,常用于防止下载,盗链]
  • User-Agent:Mozilla/4.0(Com…)[告诉服务器我的浏览器内核]
  • Cookie:[会话]
  • Connection:close/Keep-Alive [保持链接,发完数据后,我不关闭链接]
  • Date:[浏览器发送数据的请求时间]
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36"}
request = urllib2.Request(url, headers=header) # 构造一个请求对象发送请求,伪装浏览器访问

######3.3 添加更多的Header信息

在 HTTP Request 中加入特定的 Header,来构造一个完整的HTTP请求消息。

可以通过调用Request.add_header() 添加/修改一个特定的header 也可以通过调用Request.get_header()来查看已有的header。

添加一个特定的header

request.add_header("Connection", "keep-alive") # 保持连接
print request.get_full_url() # 访问的网页链接
print request.get_host() # 服务器域名
print request.get_method() # get或post
print request.get_type() # http/https/ftp response = urllib2.urlopen(request)
print response.code # 状态码200, 404,500
print response.info # 网页详细信息 data = response.read().decode("gbk")
print response.code # 响应状态码
return data

我们都知道Http协议中参数的传输是"key=value"这种简直对形式的,如果要传多个参数就需要用“&”符号对键值对进行分割。如"?name1=value1&name2=value2",这样在服务端在收到这种字符串的时候,会用“&”分割出每一个参数,然后再用“=”来分割出参数值。

4、编码与解码

编码工作使用urllib的urlencode()函数,帮我们将key:value这样的键值对转换成"key=value"这样的字符串,解码工作可以使用urllib的unquote()函数。(注意,不是urllib2.urlencode())

urllib.urlencode(keyWord) # url编码
urllib.unquote(kw) # 解码
5、抓取ajax数据
import urllib.request
import json headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"} # ajax请求url for i in range(100):
url = "https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start=%d" % (i * 20) req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req).read().decode('utf-8')
# print(response) # json数据
data = json.loads(response) for i in data['data']:
# 明星
casts = i['casts']
# 导演
directors = i['directors'] print(casts, directors)
# 写入文件
with open('movie.txt', 'a+', encoding='utf-8', errors='ignore') as f:
f.write(str((casts, directors)) + '\n')
f.flush()
6、处理HTTPS请求 SSL证书验证

现在随处可见 https 开头的网站,urllib2可以为 HTTPS 请求验证SSL证书,就像web浏览器一样,如果网站的SSL证书是经过CA认证的,则能够正常访问,如:https://www.baidu.com/等…

如果SSL证书验证不通过,或者操作系统不信任服务器的安全证书,比如浏览器在访问12306网站如:https://www.12306.cn/mormhweb/的时候,会警告用户证书不受信任。(据说 12306 网站证书是自己做的,没有通过CA认证)。

import urllib
from urllib import request import ssl context = ssl._create_unverified_context() # 忽然安全证书
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"} url = "https://www.12306.cn/mormhweb/" req = urllib.request.Request(url, headers=headers)
# 忽略证书安全ssl response = urllib.request.urlopen(req, context=context)
print(response.read().decode())

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

关注我,我们一起成长~~

yython爬虫基础知识入门的更多相关文章

  1. Python爬虫基础知识入门一

    一.什么是爬虫,爬虫能做什么 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来.比如它在抓取一个网 ...

  2. Linux基础知识入门

    [Linux基础]Linux基础知识入门及常见命令.   前言:最近刚安装了Linux系统, 所以学了一些最基本的操作, 在这里把自己总结的笔记记录在这里. 1,V8:192.168.40.10V1: ...

  3. Hibernate入门1. Hibernate基础知识入门

    Hibernate入门1. Hibernate基础知识入门 20131127 前言: 之前学习过Spring框架的知识,但是不要以为自己就可以说掌握了Spring框架了.这样一个庞大的Spring架构 ...

  4. python 爬虫基础知识一

    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 网络爬虫必备知识点 1. Python基础知识2. P ...

  5. Oracle 基础知识入门

    前记: 近来项目用到Oracle数据库,大学学了点,后面基本忘记得差不多了,虽然基本语法跟sql 差不多,但是oracle知识是非常多的. 这里简单说点基础知识,希望后面补上更多的关于ORacle知识 ...

  6. SpringMVC(一) 基础知识+入门案例

    SpringMVC基础知识 1.什么是Springmvc 2.springmvc 框架的原理(必须掌握) 前端控制器.处理器映射器.处理器适配器.视图解析器 3.SpringMVC 入门程序 目的:对 ...

  7. java学习基础知识入门

    基础入门知识(一) 一.java技术的分类 java按照技术标准和应用场景的不同分为三类,分别是JAVASE.JAVAEE.JAVAME JAVASE : 平台标准版,用于开发部署桌面,服务器以及嵌入 ...

  8. DOM0,DOM2,DOM3事件,事件基础知识入门

    事件是javascript和HTML交互基础, 任何文档或者浏览器窗口发生的交互, 都要通过绑定事件进行交互; 事件有DOM0, DOM2和DOM3的区分(别问我怎么少了一个DOM1, 也没找到DOM ...

  9. 网络爬虫基础知识(Python实现)

    浏览器的请求 url=请求协议(http/https)+网站域名+资源路径+参数 http:超文本传输协议(以明文的形式进行传输),传输效率高,但不安全. https:由http+ssl(安全套接子层 ...

随机推荐

  1. ksoap2-android的简单使用

    soap2-android 官网地址 https://simpligility.github.io/ksoap2-android/index.html 发行版本 https://oss.sonatyp ...

  2. 2、JVM的内存

    1.JVM中的内存结构 从OS的角度来看,JVM运行时会把一部分内存虚拟机化,所以把内存分为直接内存(未被虚拟机化的内存)和运行时数据区(被虚拟机化的内存) JVM的运行时数据区若从线程的角度来看,可 ...

  3. 剑指offer-字符串&数字规律

    1. 表示数值的字符串 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123",&q ...

  4. Hive中的数据类型以及案例实操

    @ 目录 基本数据类型 集合数据类型 案例实操 基本数据类型 对于Hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它 ...

  5. 一种基于均值不等式的Listwise损失函数

    一种基于均值不等式的Listwise损失函数 1 前言 1.1 Learning to Rank 简介 Learning to Rank (LTR) , 也被叫做排序学习, 是搜索中的重要技术, 其目 ...

  6. 《C++primerplus》第4章练习题

    注:略过部分题目,修改了题设要求,实现差不多的功能 1.使用字符数组.要求用户输入姓名,等第和年龄,输出其姓名和年龄,等第降一级(即字母高一级). #include<iostream> u ...

  7. 扩展、接管MVC都不会,还会用Spring Boot?

    持续原创输出,点击上方蓝字关注我 目录 前言 Spring Boot 版本 如何扩展MVC? 如何自定义一个拦截器? 什么都不配置为什么依然能运行MVC相关的功能? 如何全面接管MVC?[不推荐] 为 ...

  8. day60 Pyhton 框架Django 03

    day61 内容回顾 1.安装 1. 命令行: pip install django==1.11.18 pip install django==1.11.18 -i 源 2. pycharm sett ...

  9. 【应用服务 App Service】App Service发生错误请求时,如何查看IIS Freb日志,从中得知错误所发生的模块,请求中所携带的Header信息

    问题描述 在使用Azure App Service时候,我们有时候对 一些请求发生错误毫无头绪,能从错误代码中知道请求错误,但是更多的信息呢? 当我们需要更多的信息时候,通常有以下的一些方式来查找问题 ...

  10. flutter_bloc使用解析---骚年,你还在手搭bloc吗!

    前言 首先,有很多的文章在说flutter bloc模式的应用,但是百分之八九十的文章都是在说,使用StreamController+StreamBuilder搭建bloc,提升性能的会加上Inher ...