热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

爬虫1.1-基础知识:学习使用requests库

目录爬虫-基础知识+requests库1.状态返回码2.URL各个字段解释2.requests库3.requests库爬虫的基本流程

目录

  • 爬虫-基础知识+requests库
    • 1. 状态返回码
    • 2. URL各个字段解释
    • 2. requests库
    • 3. requests库爬虫的基本流程

爬虫-基础知识+requests库

关于html的知识,可以到w3school中进行了解学习。http://www.w3school.com.cn/html/index.asp,水平有限,这里不多提及。

1. 状态返回码

标志这这一次的请求状态,成功或失败,失败原因大概是什么

200:请求正常,服务器正常返回数据。 不代表爬去到正确信息了
301:永久重定向,比如访问www.jingdong.com 会重定向到www.jd.com
302:临时重定向,比如访问一个需要登陆的网站时,因为没有登陆会重定向到登陆页面
400:请求的url在服务器上找不到。url错误
403:服务器拒绝,权限不够
500:服务器内部错误,服务器出现bug

2. URL各个字段解释

URL:scheme://host:port/path/?query-string=xxx#anchor
scheme: 代表的是访问的协议,http https ftp...
host:主机名,域名,baidu.com
port:端口号,一般浏览器默认80
path:查询路径,文件在服务器中的位置
query-string:查询字符串,例如www.baidu.com/s?wd=python
anchor:锚点,前端用于给关键词定位的

示例

https://www.baidu.com/s?ie=UTF-8&wd=python

https://baike.baidu.com/item/html标签/6999473?fr=aladdin#2

2. requests库

requests库是python中一个非常强大的网络请求库,常用来写一些小爬虫、

浏览器抓包:使用谷歌浏览器,按F12点击Network,再按F5刷新页面即可抓包查看请求头(Requst Headers)和

表单(Form Data)数据,拷贝到自己的代码中即可防止被服务器发现一个爬虫。

get请求:

import requests
respOnse= requests.get(url, headers=headers)
print(response.content.decode('utf-8')) 
# 网页编码不全都是utf-8格式,也有可能是gbk,可以在浏览器中右键查看网页源代码,一般在最开头几行有标识 utf-8或则gb2313
# headers配置件下方代码块。

headers 是需要构建的请求头字典,配置见下方代码块。
网页源代码:response.content.decode('utf-8') 最好自己解码, temp.text自动解码,但可能出错
其他属性response.encoding响应头编码 response.status_code查看响应码 response.url 查看url

post请求:

import requests
data = {
    'username': 'xxx',
    'password': 'xx',
    'random': 'xxxx',
}
headers = {
    'COOKIE': "xxx",
    'Referer': 'xx',
    'User-Agent': 'xxxx'
}
respOnse= requests.post(url, data=data, headers=headers)

其中url应该是可以接受post请求的url

data是提交的表单,需要在浏览器中先检查好格式,然后在代码中模仿

headers是请求头,为字典形式,一般需要加入'User-Agent' 'COOKIE' 'Referer'字段,这几个字段的知识百度即可,注意headers通常都是需要添加的,如果没有添加,很可能被识别为爬虫,从而被服务器拒绝访问。

代理:

proxy = {'http':'ip:port'}
temp = requests.get(url, headers=headers, params=params, proxies=proxy) 

从参数来看似乎可以加入多个代理ip,内部有自动处理方法

会话:
s = requests.Session() 创建会话类
s.post/get (url1,xxx) 成功后会保存COOKIE等信息 然后再访问其他网页即可
s.get(url2)

处理HTTPS协议时,证书不被信任,直接request.get(url, verify=False)

更多实战代码,请查看其他笔记。

3. requests库爬虫的基本流程

前面提到requests库适用于小爬虫,对于整站爬取这种工作是不适宜的,原因在于url防重控制和异步问题。

3.1 爬虫框架

第一步,分析需要爬取页面的规则,例如爬取拉勾网搜索python关键词之后的全部岗位,拉勾网先给出一个职位简介列表,点击没一个简介即可进入每个职位的详情页,而我们的爬虫正是需要解析这些详情页里面的内容。根据浏览器的user-agent, COOKIE, referer等字段伪造请求头。

第二步,分析url变化规则,例如boss直聘网的python职位列表变化在于page=x,所以只要在代码中加入

for x in (1, max+1) ,就可以遍历所有的列表,在其中取得详情页的url,其中max为网站中给出的最大值。

https://www.zhipin.com/c101270100/?query=python&page=4

第三步,使用xpath或者正则,在列表页中提取出详情页的url并访问,利用xpath或者正则表达式提取想要的信息

第四步,将信息存储(json, csv, txt等)

3.2 一个样例代码

# 古诗文网爬虫,正则表达式提取信息

import re
import csv
import requests


# 头部
HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    'COOKIE': 'sec_tc=AQAAAOnYGRKNjAwAc6jZqzitZLqPPmaN; Hm_lvt_04660099568f561a75456483228a9516=1543214277; ASP.NET_SessiOnId=q2b21uwthctq4aad0vbc5x5e; Hm_lpvt_04660099568f561a75456483228a9516=1543214320',
    'referer': 'https://www.gushiwen.org/default_1.aspx',
}

# 处理页面信息的函数
def parse_page(url):
    global data  # data是列表,用于存储每篇古诗字典
    respOnse= requests.get(url, headers=HEADERS)
    response_text = response.text
    # 四个正则表达式 选中大范围再缩小范围,   .*?作用是非贪婪模式 获取两个标签之间的所有内容
    titles = re.findall(r'.*?(.*?)', response_text,re.DOTALL)
    dynasties = re.findall(r'

.*?(.*?)', response_text) authors = re.findall(r'.*?(.*?)', response_text) cOntens= re.findall(r'

(.*?)
', response_text, re.DOTALL) poeminfo = {} for i in contens: contens[contens.index(i)] = re.sub(r'<.*?>', "", i).strip() # .strip()函数用于去除\n 空格等 # zip函数是将多个列表依次打包,[1,2] [3,4]会被组合成(1,3) (2,4) for value in zip(titles, dynasties, authors, contens,): title, dynasty, author, cOntent= value # 这里相当于解包并对应取值 poeminfo = { 'title': title, 'dynasty': dynasty, 'author': author, 'content': content } data.append(poeminfo) # 存入列表 def get_url(): url_list = [] base_url = 'https://www.gushiwen.org/default_{}.aspx' for i in range(1, 100): url = base_url.format(i) url_list.append(url) return url_list def csv_write(data): # 构造头部 csv_headers = ['title', 'dynasty', 'author', 'content'] with open('gushici.csv', 'w', encoding='utf-8', newline='') as fp: writer = csv.DictWriter(fp, csv_headers) writer.writeheader() writer.writerows(data) fp.close() if __name__ == '__main__': data = [] list = get_url() for url in list: parse_page(url) for i in data: print(i) print("=" * 50) print(url) print("=" * 50) csv_write(data) # 将获取的数据写入csv文件

推荐阅读
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
author-avatar
三封封封_391
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有