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. .NetCore.RazorPages 获取访客的公网IP与局域网IP

    dotnet.core 获取访客的公网IP与局域网IP 现在奉上代码 public void OnGet() {var ip = Content(HttpContext.Connection.Remo ...

  2. python数据结构树和二叉树简介

    一.树的定义 树形结构是一类重要的非线性结构.树形结构是结点之间有分支,并具有层次关系的结构.它非常类似于自然界中的树.树的递归定义:树(Tree)是n(n≥0)个结点的有限集T,T为空时称为空树,否 ...

  3. VS 高级版本新建的项目如何降级使低版本 VS 可以打开

    转载:https://blog.csdn.net/u012814856/article/details/70325267 一.引言 这里因为工作的原因,公司项目使用的是 VS2015 的编译环境,但是 ...

  4. ubuntu 18.04 搭建flask服务器(大合集,个人实操)

    ubuntu 18.04 搭建flask服务器(大合集) Ubuntu python flask 服务器 本次使用的Ubuntu版本为:Ubuntu 18.04.5 LTS (GNU/Linux 4. ...

  5. JS常见加密混淆方式

    目录 前端js常见混淆加密保护方式 eval方法等字符串参数 emscripten WebAssembly js混淆实现 JSFuck AAEncode JJEncode 代码压缩 变量名混淆 字符串 ...

  6. 树状数组(BIT)—— 一篇就够了

    树状数组(BIT)-- 一篇就够了 前言.内容梗概 本文旨在讲解: 树状数组的原理(起源,原理,模板代码与需要注意的一些知识点) 树状数组的优势,缺点,与比较(eg:线段树) 树状数组的经典例题及其技 ...

  7. sublime python配置运行

    1.安装python环境 安装完成时,Win+R → 输入cmd → Enter → 调出来命令行,输入python确认安装是否成功. 2.安装sublime 3.打开sublime,选择工具--编译 ...

  8. linunx常用命令综合

    # linux常用命令exsi 6.5虚拟化系统命令大全 https://www.runoob.com/linux/linux-command-manual.html# sudo -i 设置切换无密码 ...

  9. monolog 日志

    1 安装 composer require monolog/monolog 2 使用 // 创建日志服务 $logger = new Logger('my_logger'); // 定义一个handl ...

  10. centos8安装kafka(单机方式)

    一,下载kafka 1,官网地址 http://kafka.apache.org/downloads.html 2,下载 [root@localhost source]# wget http://mi ...