文章目录

  • 爬虫流程
  • 爬虫入门代码示例
    • 关于响应结果
  • 通用爬虫 - requests模块
    • 代码示例
      • get请求
      • post请求
      • ajax get请求
      • ajax post请求
    • 练习 - 普通爬虫
  • 聚焦爬虫
    • 正则
      • 介绍
      • 代码示例
    • xpath
      • xpath实例化
      • xpath表达式
      • 代码示例
    • bs4
      • 使用
      • 方法
      • 选择器
    • 代码示例
  • cookie的使用
    • 代码示例

爬虫流程

重写ua
指定url
封装参数
通用爬虫
聚焦爬虫
导入模块
发起请求
处理响应
持久化存储
处理数据

爬虫入门代码示例

# 最简单的爬虫# 导入模块
import requests# 指定url
url = "https://www.sogou.com/web"# 发送请求, 拿到响应结果
rep = requests.get(url=url)# 得到网页原编码
repEncode = rep.encoding
with open(filename, "w", encoding=repEncode) as f:f.write(rep.text)

关于响应结果

方法 结果
response.status_code 状态码, 正常为200
response.encoding 网页原字符编码
response.text 字符串
response.content bytes类型结果
response.url 请求的url
response.headers 请求头信息

通用爬虫 - requests模块

代码示例

get请求

"""带参数发送get请求, 之后所有代码都会进行ua伪装"""
# 导入模块
import requests# 重写ua(ua伪装)
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
}# 指定url
url = "https://www.sogou.com/web"# 封装参数
params = {"query": "美女图片",
}# 发送请求, 拿到响应结果
rep = requests.get(url=url, params=params, headers=headers)# 得到网页原编码
repEncode = rep.encoding
with open(filename, "w", encoding=repEncode) as f:f.write(rep.text)

post请求

import requests# 指定url
url = "xxx"# ua伪装
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
}# 设置参数
data = {"keyA": "valueA","keyB": "valueB",
}# 发送post请求
rep = requests.post(url=url, data=data, headers=headers)# 获取取数据
repText = rep.text# 模拟持久化存储
print(repText)

ajax get请求

import requests# 通过抓包确定url
url = "http://image.so.com/zjl?ch=beauty&sn=60&listtype=new&temp=1"# 处理参数
param = {"ch": "beauty","sn": "60","listtype": "new","temp": "1",
}# 伪装ua
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
}# 发送请求
rep = requests.get(url=url, params=param, headers=headers)repEncode = rep.encoding
repText = rep.textprint(repText)# 输出结果
with open("360pic美女.html","w",encoding=repEncode) as f:f.write(repText)

ajax post请求

import requests# 通过转包确定url
url = "http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword"data = {"cname": "","pid": "","keyword": "北京","pageindex": "3","pageSize": "10",
}headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
}rep = requests.post(url=url, data=data, headers=headers)print(rep.text)

练习 - 普通爬虫

# get请求 爬取页码范围内的数据
#
# 涉及内容:
#   1. 交互
#   2. 代理IPimport requests# 指定url
url = "https://www.sogou.com/sogou"# 获取关键字, 页码范围
keyword = input("input key word: ")
startPage = int(input("input start page: "))
endPage = int(input("input end page: "))# ua伪装
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
}# 循环页码范围, 分别设定参数并请求数据, 增加了代理ip设置
for i in range(startPage, endPage+1):params = {"query": keyword,"page": str(i),}# 增加代理ip设置, 网址www.goubanjia.com# 在网页中选择一个ip, 在proxies参数中填写协议和ip端口rep = requests.get(url=url, params=params, headers=headers, proxies={"http": "117.127.16.207:8080"})# 获取页面的编码repEncode = rep.encoding# 文件名fileName = "{}_{}.html".format(keyword, i)# 根据编码写入文件with open(fileName, "w", encoding=repEncode) as f:f.write(rep.text)

聚焦爬虫

正则

介绍

正则表达式


代码示例

import requests
import re
import os# 指定url
url = "https://www.qiushibaike.com/pic/"# 伪装ua
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
}# 发请求, 得到数据
rep = requests.get(url=url,headers=headers)# 拿到页面数据
repText = rep.text# 设定正则条件
re_rule = '<div class="thumb">.*?<img src="//(.*?)" .*?</div>' # 这里使用正则的非贪婪匹配模式# 根据正则拿到图片地址
img_url = re.findall(re_rule, repText, re.S) # re.S单行匹配(simple), re.M多行匹配(More), re.I忽略大小写(ignore)# 设置图片存储路径
if not os.path.exists("./qiutu"):os.mkdir("qiutu")# 循环正则匹配的结果
for i in img_url:# 完善urlurl = "http://" + i# 根据url请求图片r = requests.get(url=url, headers=headers)# 获得二进制数据rCont = r.content# 生成文件名filename = i.split("/")[-1]# 指定存储路径file = "./qiutu/" + filename# 持久化存储with open(file,"wb") as f:f.write(rCont)print("{}下载完成".format(file))

xpath

xpath实例化

# 使用本地文件
tree = etree.parse(文件名)
tree.xpath("xpath表达式")# 使用网络数据
tree = etree.HTML(网页内容字符串)
tree.xpath("xpath表达式")

xpath表达式

属性定位:# 找到class属性值为song的div标签//div[@class="song"] 层级&索引定位:# 找到class属性值为tang的div的直系子标签ul下的第二个子标签li下的直系子标签a//div[@class="tang"]/ul/li[2]/a逻辑运算:# 找到href属性值为空且class属性值为du的a标签//a[@href="" and @class="du"]模糊匹配://div[contains(@class, "ng")]//div[starts-with(@class, "ta")]取文本:# /表示获取某个标签下的文本内容# //表示获取某个标签下的文本内容和所有子标签下的文本内容//div[@class="song"]/p[1]/text()//div[@class="tang"]//text()取属性://div[@class="tang"]//li[2]/a/@href

代码示例

# 爬取17173手游网即将开测
import requests
from lxml import etree
import xlwtdef write_excel(data):# 创建一个workbook 设置编码workbook = xlwt.Workbook(encoding='utf-8')# 创建一个worksheetworksheet = workbook.add_sheet('My Worksheet')# 写入excel# 参数对应 行, 列, 值for i in range(len(data)):for j in range(len(data[i])):if len(data[i][j]) > 1:data[i][j] = "{}, {}".format(data[i][j][0], data[i][j][1])worksheet.write(i, j, data[i][j])# 保存workbook.save('Excel_test.xls')def spider():"""爬取特定url的数据并将数据处理, 返回列表:return:"""url = "http://newgame.17173.com/shouyou/ceshi"# ua伪装headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"}# 请求rep = requests.get(url=url, headers=headers)rep_text = rep.texttree = etree.HTML(rep_text) # tree 是element 类型# 获取列表div_list = tree.xpath('//div[@class="g-box4 box"][1]//ul[2]/li')ret = [["游戏名", "上线时间", "测试类型", "游戏类型", "平台", "工作室"]]for i in div_list:name = i.xpath('.//h6[@class="c1"]/a/text()')time = i.xpath('.//p[@class="c2"]/text()')qa_type = i.xpath('.//p[@class="c3"]/text()')game_type = i.xpath('.//i[@class="c4"]/text()')plate = i.xpath('./p[@class="c5"]/span//text()')auth = i.xpath('.//span[@class="c7"]/text()')data = [name, time, qa_type, game_type, plate, auth]ret.append(data)return retif __name__ == "__main__":data = spider()# print(data)write_excel(data)

bs4

使用

# 封装成bs4对象
# 本地
soup = BeautifulSoup(open('localfile'), 'lxml')# 网络
soup = BeautifulSoup(bytes类型数据, 'lxml')
使用bs4对象的方法

方法

# 根据标签名查找
soup.a # 找到第一个a标签# 获取属性
soup.a.attrs # 获取a的说有属性和属性值, 返回值为dict
soup.a.attrs["href"] # 获取href属性
soup.a["href"] # 同上# 获取内容
soup.a.string # 类似xpath中的 /text()
soup.a.text # 类似xpath中的 //text()
soup.a.get_text() # 同上# find 找到第一个符合要求的标签
soup.find("a")  # 找到第一个a标签
soup.find("a", title="xxx") # 找到第一个title属性为xxx的a标签
soup.find("a", class_="xxx") # 找到第一个class属性为xxx的a标签, 注意有下划线
soup.find("a", id="xxx") # 找到第一个id属性为xxx的a标签# find_all 找到所有符合要求的标签
soup.find_all("a") # 找到所有的a标签, 返回值为list
soup.find_all(["a","b"]) # 找到所有的a标签和b标签
soup.find_all("a", limit=2) # 限制前2个# 选择器
soup.select("#xxx") # 找到id为xxx的标签
soup.select(".book-mulu > ul > li") # 找到类为book-mulu, 子标签ul, 子标签li

选择器

  • 普通选择器

    • 标签选择器(div)
    • 类选择器(.)
    • id选择器(#)
  • 层级选择器
    • . a #b .c #d --> //(后代选择器)
    • .a>#b>.c>#d --> /(子代选择器)

代码示例

# 爬取三国演义import requests
from bs4 import BeautifulSoup# 指定url
url = "http://www.shicimingju.com/book/sanguoyanyi.html"# 拿到域名
url_root = "http://"+url.split('/')[2]# ua伪装
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
}# 发请求, 拿到结果
rep = requests.get(url=url, headers=headers)
rep_text = rep.text# 实例化为bs4对象
soup = BeautifulSoup(rep_text,'lxml')# 创建文件句柄
fp = open('./sanguo.txt','w',encoding="utf-8")# 使用bs4选择器找到多个标签
li_list = soup.select(".book-mulu > ul > li")# 循环标签拿到标题和章节连接
for i in li_list:# 拿到标题title = i.a.text# 拿到章节连接, 并拼接为正常连接content = url_root+i.a["href"]# 请求, 拿到响应对象content_page_text = requests.get(url=content, headers=headers).text# 实例化bs4对象soup = BeautifulSoup(content_page_text, "lxml")# 用find拿到唯一值content_text = soup.find('div', class_="chapter_content").text# 持久化存储fp.write(title+""+content_text)# 关闭文件句柄
fp.close()

cookie的使用

# 实例化
session = requests.session()# 使用方法和requests.get; requests.post相同
session.post(url=url, data=data, headers=headers)  # 会将cookies自动存到headerssession.get(url=url, params=params, headers=headers) # 会带着cookies进行请求

代码示例

# 爬取人人网页面
import requestsurl = "http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2019731514156"# ua伪装
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
}# 封装参数
data = {"email":"15810020949","icode":"","origURL":"http://www.renren.com/home","domain":"renren.com","key_id":"1","captcha_type":"web_login","password":"xxxxxxxxxxxxxxxxxxxxxxxxx","rkey":"386db1871dce1b360f18ae81a91aabdf","f":"http%3A%2F%2Fwww.renren.com%2F266632989",}session = requests.session()# 使用session发请求, 会将cookies自动存到headers
session.post(url=url, headers=headers, data=data)url = "http://www.renren.com/266632989/newsfeed/photo"
rep = session.get(url=url, headers=headers)
with open('./renren.html','w',encoding='utf-8') as f:f.write(rep.text)

爬虫学习笔记 - day02相关推荐

  1. day02---python爬虫学习笔记---------------化妆品生产许可证关系系统服务平台

    day02-python爬虫学习笔记---------------化妆品生产许可证关系系统服务平台 一.对页面进行分析 化妆品生产许可证关系系统服务平台 可发现次应爬取的为页面中的详细信息而非页面中带 ...

  2. 爬虫学习笔记(十)—— Scrapy框架(五):下载中间件、用户/IP代理池、settings文件

    一.下载中间件 下载中间件是一个用来hooks进Scrapy的request/response处理过程的框架. 它是一个轻量级的底层系统,用来全局修改scrapy的request和response. ...

  3. Python3 爬虫学习笔记 C18【爬虫框架 pyspider — 深入理解】

    Python3 爬虫学习笔记第十八章 -- [爬虫框架 pyspider - 深入理解] 文章目录 [18.1]启动参数 [18.2]运行单个组件 [18.2.1]运行 Scheduler [18.2 ...

  4. Python3 爬虫学习笔记 C17【爬虫框架 pyspider — 基本使用】

    Python3 爬虫学习笔记第十七章 -- [爬虫框架 pyspider - 基本使用] 文章目录 [17.1]初识 pyspider [17.2]使用 pyspider [17.2.1]主界面 [1 ...

  5. Python3 爬虫学习笔记 C16【数据储存系列 — Redis】

    Python3 爬虫学习笔记第十六章 -- [数据储存系列 - Redis] 文章目录 [16.1]关于 Redis [16.2]使用 Redis [16.3]Key(键)操作 [16.4]Strin ...

  6. Python3 爬虫学习笔记 C15【代理的基本使用】

    Python3 爬虫学习笔记第十五章 -- [代理的基本使用] 文章目录 [15.1]代理初识 [15.2]urllib 库使用代理 [15.3]requests 库使用代理 [15.4]Seleni ...

  7. Python3 爬虫学习笔记 C14【验证码对抗系列 — 点触验证码】

    Python3 爬虫学习笔记第十四章 -- [验证码对抗系列 - 点触验证码] 文章目录 [14.1]关于点触验证码 [14.2]点触验证码攻克思路 [14.3]模拟登录 12306 - 总体思路 [ ...

  8. Python3 爬虫学习笔记 C13【验证码对抗系列 — 滑动验证码】

    Python3 爬虫学习笔记第十三章 -- [验证码对抗系列 - 滑动验证码] 文章目录 [13.1]关于滑动验证码 [13.2]滑动验证码攻克思路 [13.3]模拟登录 bilibili - 总体思 ...

  9. Python3 爬虫学习笔记 C12【验证码对抗系列 — 图形验证码】

    Python3 爬虫学习笔记第十二章 -- [验证码对抗系列 - 图形验证码] 文章目录 [12.1]关于普通图形验证码 [12.2]tesserocr 库识别验证码 [12.3]pytesserac ...

最新文章

  1. 学习笔记-express路径问题
  2. oracle菜鸟学习之 分析函数-排序
  3. Spring Cloud 学习笔记(四)-Spring Cloud Hystrix
  4. MySQL 数据库 InnoDB 和 MyISAM 数据引擎的差别
  5. 13道BGP属性面试题
  6. 删除未使用的引用 | Visual Studio 2019(16.10)新功能试用
  7. wordpress模板-RIPro-V2子主题V1.4-VAN主题
  8. opensource项目_最佳Opensource.com:艺术与设计
  9. Linux 用户he用户组管理
  10. mongodb插入数据_MongoDB插入
  11. 【Maven】1.使用myecplise配置自己的Maven配置,不使用默认的maven
  12. 学会查找问题的源头:网吧系统强制下载QQ浏览器
  13. centos usb转网口_CentOS 6.5安装qf9700 USB网卡驱动
  14. 美味连连-QQ游戏辅助-简单实用的QQ游戏美味连连辅助(非外挂)
  15. mac 安装 qt5 for tsmuxer
  16. ffmpeg每隔1秒抽取视频的1帧画面
  17. 如何对加密的m3u8、ts文件进行合并
  18. 马斯克为房地产代言“献身”,洗泡泡浴还被五花大绑,看完广告我瞎了
  19. Play! framework开发规范
  20. 几款流行开源ESB总线简介

热门文章

  1. VMware 虚拟机安装黑屏问题
  2. AI赋能智慧图书馆,能否出现真正的书天堂?
  3. Visual studio2022“无法生成.exe文件,系统找不到指定文件
  4. LeetCode刷题指南
  5. Windows 常用组合键(热键)
  6. 蚂蚁集团副总裁,任复旦大学人工智能学院院长!
  7. “钢铁直猿”专属,5·20硬核表白方式三连击
  8. 一加3 android 8.0,一加3 android 8.0 启动uiautomator server失败
  9. Java实现简单日期计算功能
  10. APP推广的渠道与运营模式分析