爬虫1.1-基础知识+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'<div\sclass="cont">.*?<b>(.*?)</b>', response_text,re.DOTALL)
dynasties = re.findall(r'<p class="source">.*?<a.*?>(.*?)</a>', response_text)
authors = re.findall(r'<span>:</span>.*?<a.*?>(.*?)</a>', response_text)
contens = re.findall(r'<div class="contson" id=.*?>(.*?)</div>', 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文件
爬虫1.1-基础知识+requests库的更多相关文章
- 爬虫入门一 基础知识 以及request
title: 爬虫入门一 基础知识 以及request date: 2020-03-05 14:43:00 categories: python tags: crawler 爬虫整体概述,基础知识. ...
- 【Python爬虫】HTTP基础和urllib库、requests库的使用
引言: 一个网络爬虫的编写主要可以分为三个部分: 1.获取网页 2.提取信息 3.分析信息 本文主要介绍第一部分,如何用Python内置的库urllib和第三方库requests库来完成网页的获取.阅 ...
- Python爬虫学习==>第八章:Requests库详解
学习目的: request库比urllib库使用更加简洁,且更方便. 正式步骤 Step1:什么是requests requests是用Python语言编写,基于urllib,采用Apache2 Li ...
- Python爬虫:HTTP协议、Requests库(爬虫学习第一天)
HTTP协议: HTTP(Hypertext Transfer Protocol):即超文本传输协议.URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源. HTTP协议 ...
- Python爬虫(二):Requests库
所谓爬虫就是模拟客户端发送网络请求,获取网络响应,并按照一定的规则解析获取的数据并保存的程序.要说 Python 的爬虫必然绕不过 Requests 库. 1 简介 对于 Requests 库,官方文 ...
- 爬虫(三):Requests库的基本使用
一:什么是Requests Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库如果你看过上篇文章关于urllib库的使用,你会发现 ...
- python之爬虫(四)之 Requests库的基本使用
什么是Requests Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库如果你看过上篇文章关于urllib库的使用,你会发现,其 ...
- Python爬虫:HTTP协议、Requests库
HTTP协议: HTTP(Hypertext Transfer Protocol):即超文本传输协议.URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源. HTTP协议 ...
- 爬虫入门【2】Requests库简介
发送请求 使用Requests发送网络请求很简单 #首先要导入requests库 import requests #返回一个Response对象 r=requests.get('https://git ...
随机推荐
- ElasticSearch搜索服务技术
ElasticSearch 基于的lucene开发的搜索服务技术;天生支持分布式; Es的结构 gatway:存储层,所有的数据可以存储在本地(多个es节点形成分布式存储),hdfs输出位置,共享文件 ...
- 查询sqlserver 表结构呀
SQL Server里查询表结构命令 对于SQL Server数据库有两种方法查询表结构 第一种方法 sp_help Accounts_Users 其中Accounts_Users 表示表名 ...
- JavaScript小练习2-网页换肤
题目 分析 三个皮肤切换按钮的选择 用li即可. 点击显示白点 li中嵌套一个li,onclick时改变子元素li的css onload 当页面加载完成后立即执行一段JavaScript代码. onl ...
- Vue中把从后端取出的时间进行截取
未截取前 截取后 方法: </div>{{times}}</div> export default{ data() { return { // getTime储存从服务器请求回 ...
- ZXing.net 生成和解析二维码
nuget引用zxing.net包 public partial class Form1 : Form { public Form1() { InitializeComponent(); } priv ...
- mysql 一看就会 基本语法
创建表 create table <表名>( <字段名> 类型(长度) not null primary key auto_increment, **主键 name char ...
- 【CodeForces 129 B】Students and Shoelaces(拓扑排序)
Anna and Maria are in charge of the math club for junior students. When the club gathers together, t ...
- Spring : JPA的单独使用
title: 如何单独使用spring data jpa 引用pom文件: <dependency> <groupId>org.springframework.data< ...
- mysql 几种搜索引擎的比较
mysql中常见的数据库引擎之间的比较 转载自 深入浅出mysql数据库 MySQL5.5以后默认使用InnoDB存储引擎,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表. 若 ...
- 学习 Git的使用过程
原文链接: http://www.cnblogs.com/NickQ/p/8882726.html 学习 Git的使用过程 初次使用 git config --global user.name &qu ...