python爬虫笔记01
1.urllib库中request,parse的学习
1.1 简单的请求页面获取,并下载到本地 request的使用
from urllib import request # 获取此网页的demout
resp = request.urlopen('http://www.baidu.com') # 读出10个字符
# 结果为 b'<!DOCTYPE ' b代表bytes 是一个字节流
# '<!DOCTYPE ' 包括空格 正好十个字符
# print(resp.read(10)) # 读取一行
# 结果为 b'<!DOCTYPE html>\n'
# \n 代表换行
# ()里面可以写读几行
# print(resp.readline()) # 全部读取 二者对应的返回类型不同
# <class 'list'> readlines
# <class 'bytes'> read
# print(type(resp.readlines()))
# print(type(resp.read())) # 下载到本地文件夹
request.urlretrieve('http://www.baidu.com', 'baidu.html')
1.2 parse的使用
1.2.1 解决中文与码的对应问题
例:中文变成码 name=%E9%AB%98%E8%BE%BE 这些带%和中文之间的转换
# 主要解决网址中中文是解析不了的问题 from urllib import request
from urllib import parse # 中文变成码 name=%E9%AB%98%E8%BE%BE&age=21 # urlencode函数 把字典转化为字符串
params = {'name': '高达', 'age': ''}
result = parse.urlencode(params)
# 结果为
# <class 'str'>
# name=%E9%AB%98%E8%BE%BE&age=21
print(type(result))
print(result) # 如果直接在网址写中文会报错,虽然我们看到的是中文但是实际上是中文对应的码
# resp = request.urlopen('https://www.baidu.com/s?wd=刘德华') # 写出一个字典
params = {'wd': '刘德华'}
print(params)
# 转化成正确的网站上的格式
qs = parse.urlencode(params)
print(qs)
# 这样请求就能成功
resp = request.urlopen('https://www.baidu.com/s?'+qs)
# print(resp.readlines())
# parse.parse_qs函数 还原解码
result = parse.parse_qs(qs)
# 结果为
# <class 'dict'>
# {'wd': ['刘德华']}
print(type(result))
print(result)
1.2.2 解析网址
# 解析网址
from urllib import parse def test():
# 测试用的 url
url = 'http://www.baidu.com/s;sssas?wd=python&username=abc#1'
url1 = 'http://www.baidu.com/s?wd=python&username=abc#1'
url2 = 'https://api.bilibili.com/x/v2/reply?callback=jQuery17204184039578913048_1580701507886&jsonp=jsonp&pn=1&type=1&oid=70059391&sort=2&_=1580701510617'
result1 = parse.urlparse(url)
# <class 'urllib.parse.ParseResult'>
print(type(result1))
# 结果为 ParseResult(scheme='http', netloc='www.baidu.com', path='/s', params='sssas', query='wd=python&username=abc',
# fragment='1')
# print(result1)
# print('scheme:', result1.scheme)
# print('netloc:', result1.netloc)
# print('path: ', result1.path)
# print('params: ', result1.params)
# print('query: ', result1.query)
# print('fragment: ', result1.fragment)
result2 = parse.urlsplit(url)
print(result2)
# urlparse函数与 urlsplit函数的对比
# urlparse函数多一个params
result1 = parse.urlparse(url1)
result2 = parse.urlsplit(url1)
print(result1)
print(result2)
# result3 = parse.urlparse(url2)
# print('r3:', result3.query) # 格式化输出函数
def myself_urlparse(url):
result = parse.urlparse(url)
print('scheme:', result.scheme)
print('netloc:', result.netloc)
print('path: ', result.path)
print('params: ', result.params)
print('query: ', result.query)
print('fragment: ', result.fragment) def myself_urlsplit(url):
result = parse.urlsplit(url)
print('scheme:', result.scheme)
print('netloc:', result.netloc)
print('path: ', result.path)
print('query: ', result.query)
print('fragment: ', result.fragment) if __name__ == '__main__':
test()
1.3 使用代理IP
# ip代理
from urllib import request
# 没有代理是用本地ip
url = 'http://www.baidu.com'
resp = request.urlopen(url)
# print(resp.read()) # 使用代理
handler = request.ProxyHandler({'http': '60.170.234.221:65309'})
opener = request.build_opener(handler)
resp = opener.open(url)
print(resp.read())
1.4CookieJar
cokkie信息可以直接写在headers请求头里面,也可以创建CookieJar对象
# cookie信息
from urllib import request
from http.cookiejar import CookieJar
from urllib import parse
# 登录 cookiejar = CookieJar()
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
# 最简单的就是在handers中写cookie
handers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400'
} data = {
'login-username': '',
'login-passwd': 'w5153300'
}
url = 'https://passport.bilibili.com/login' req = request.Request(url, data=parse.urlencode(data).encode('utf-8'), headers=handers, method='GET')
# 自动保存cokie信息
opener.open(req) # 访问个人主页
url1 = 'https://space.bilibili.com/141417102' # 使用之前的opener
req = request.Request(url1, headers=handers)
resp = opener.open(url1)
# 写入本地
with open('a.html', 'w', encoding='utf-8')as fp:
fp.write(resp.read().decode('utf-8'))
2.1 requests的使用 它是对urllib的再次封装,它们使用的主要区别:
requests可以直接构建常用的get和post请求并发起,urllib一般要先构建get或者post请求,然后再发起请求。
import requests resp = requests.get("https://www.baidu.com/")
#
#
# 返回响应内容 源码 返回对象str 有乱码就要decode解码
# print(type(resp.text))
# print(resp.text.decode('utf-8')) # 返回响应内容 源码 返回对象bytes
# print(type(resp.content))
# print(resp.content) #
print(resp.url)
# https://www.baidu.com/
print(resp.encoding)
# ISO-8859-1
print(resp.status_code)#
200
print(resp.headers)
print(resp.cookies)
import requests # 写入请求头 # params = {
# 'wd': '中国'
# }
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400'
}
resp = requests.get("https://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD&rsv_spt=1&rsv_iqid=0xc673aab900009518&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=56060048_11_pg&ch=6&rsv_enter=0&rsv_dl=tb&rsv_sug3=4&rsv_sug1=2&rsv_sug7=101&prefixsug=%25E4%25B8%25AD%25E5%259B%25BD%2520&rsp=1&inputT=5214&rsv_sug4=5933",headers=headers) with open('a.html', 'w', encoding='utf-8')as fp:
fp.write(resp.content.decode('utf-8'))
print(resp.url)
import requests # 使用代理ip
proxy = {
'http': 'http://47.100.124.14/'
}
resp = requests.get('https://www.baidu.com', proxies=proxy)
print(resp.content.decode('utf-8'))
import requests
resp = requests.get("https://www.baidu.com/")
# 查看cookies信息
print(resp.cookies.get_dict())
session = requests.Session()
# 处理不信任的SSL证书
# 网站是https需要
# 出现错误是因为这个网站不是这个证书
import requests
resp = requests.post("https://www.baidu.com/", verify=False)
3.1 XPath
XPath语法
补充 :text()是提取该标签下的文本
图片来自于https://www.w3school.com.cn/xpath/xpath_syntax.asp
import requests
from lxml import html etree = html.etree
parser = etree.HTMLParser(encoding='utf-8')
html = etree.parse('a.html', parser=parser)
divs = html.xpath('//div')
# 返回一个列表
for div in divs:
print(etree.tostring(div, encoding='utf-8').decode('utf-8'))
import requests
from lxml import html etree = html.etree
url = 'https://www.dytt8.net/html/gndy/dyzz/list_23_1.html'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400',
'Referer': 'https://movie.douban.com/'
}
resp = requests.get(url, headers=headers)
# print(text)
text = resp.content.decode('gbk')
# print(text)
html = etree.HTML(text)
# []里面@XXX=XXX是寻找特定的属性,在/后面@属性是要这个值的
urls = html.xpath("//table[@class='tbspan']//a/@href")
# nead_urls = []
for url in urls:
# nead_urls.append('https://www.dytt8.net'+url)
print('https://www.dytt8.net'+url)
import requests
from lxml import html etree = html.etree # 请求头 网站url
url = 'https://movie.douban.com/cinema/nowplaying/langfang/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400',
'Referer': 'https://movie.douban.com/'
}
resp = requests.get(url,headers=headers)
# text str content bytes
# text 解码过的
# print(resp.content.decode('utf-8'))
# print(resp.text) # 转化为html 对象 <class 'lxml.etree._Element'>
html = etree.HTML(resp.text)
print(type(html))
ul = html.xpath("//ul[@class='lists']")[0]
# print(ul)
# print(etree.tostring(ul,encoding='utf-8').decode('utf-8')
# 取出li标签存入lis
lis = ul.xpath("./li")
# print(etree.tostring(li,encoding='utf-8').decode('utf-8'))
a = html.xpath("//div[@id='upcoming']//a[@data-psource='title']")
for x in a:
name = x.xpath('@title')
href = x.xpath('@href')
print(href)
print(name)
# for li in lis:
# # 取出@data-title属性的值
# name = li.xpath("@data-title")
# print(name)
# # 取出图片链接
# img = li.xpath(".//img/@src")
# print(img)
3.2 正则表达式
import re
import requests def parse_page(url):
headers = {
'User-Agent': 'Mozilla / 5.0(Windows NT 10.0;WOW64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 79.0.3945.130Safari / 537.36'
}
resp = requests.get(url,headers)
text = resp.text
# re.DOTALL .也可以匹配换行符
titles = re.findall(r'<div\sclass="cont">.*?<b>(.*?)</b>', text, re.DOTALL)
print(titles) def main():
# url ='https://www.gushiwen.org/default_1.aspx'
for x in range(1, 10):
url ='https://www.gushiwen.org/default_%s.aspx' % x
parse_page(url) if __name__ == '__main__':
main()
python爬虫笔记01的更多相关文章
- python爬虫笔记Day01
python爬虫笔记第一天 Requests库的安装 先在cmd中pip install requests 再打开Python IDM写入import requests 完成requests在.py文 ...
- [Python爬虫笔记][随意找个博客入门(一)]
[Python爬虫笔记][随意找个博客入门(一)] 标签(空格分隔): Python 爬虫 2016年暑假 来源博客:挣脱不足与蒙昧 1.简单的爬取特定url的html代码 import urllib ...
- Python爬虫笔记一(来自MOOC) Requests库入门
Python爬虫笔记一(来自MOOC) 提示:本文是我在中国大学MOOC里面自学以及敲的一部分代码,纯一个记录文,如果刚好有人也是看的这个课,方便搬运在自己电脑上运行. 课程为:北京理工大学-嵩天-P ...
- Python 学习笔记01
print:直接输出 type,求类型 数据类型:字符串,整型,浮点型,Bool型 note01.py # python learning note 01 print('Hello w ...
- Python爬虫笔记(一):爬虫基本入门
最近在做一个项目,这个项目需要使用网络爬虫从特定网站上爬取数据,于是乎,我打算写一个爬虫系列的文章,与大家分享如何编写一个爬虫.这是这个项目的第一篇文章,这次就简单介绍一下Python爬虫,后面根据项 ...
- python爬虫入门01:教你在 Chrome 浏览器轻松抓包
通过 python爬虫入门:什么是爬虫,怎么玩爬虫? 我们知道了什么是爬虫 也知道了爬虫的具体流程 那么在我们要对某个网站进行爬取的时候 要对其数据进行分析 就要知道应该怎么请求 就要知道获取的数据是 ...
- Python爬虫笔记安装篇
目录 爬虫三步 请求库 Requests:阻塞式请求库 Requests是什么 Requests安装 selenium:浏览器自动化测试 selenium安装 PhantomJS:隐藏浏览器窗口 Ph ...
- Python爬虫笔记技术篇
目录 前言 requests出现中文乱码 使用代理 BeautifulSoup的使用 Selenium的使用 基础使用 Selenium获取网页动态数据赋值给BeautifulSoup Seleniu ...
- Python爬虫笔记【一】模拟用户访问之设置请求头 (1)
学习的课本为<python网络数据采集>,大部分代码来此此书. 网络爬虫爬取数据首先就是要有爬取的权限,没有爬取的权限再好的代码也不能运行.所以首先要伪装自己的爬虫,让爬虫不像爬虫而是像人 ...
随机推荐
- 解题报告:luogu P5543 [USACO19FEB]The Great Revegetation S
题目链接:P5543 [USACO19FEB]The Great Revegetation S 好坑啊,都身败名裂了. 思路一: 考虑染色法,跑一遍搜所就好了,不给代码了. 思路二: 考虑并查集,我想 ...
- selenium抓取淘宝数据报错:warnings.warn('Selenium support for PhantomJS has been deprecated, please use headless
ssh://root@192.168.33.12:22/root/anaconda3/bin/python3 -u /www/python3/maoyantop100/meishi_selenium. ...
- activiti 全局流程监听ActivitiEventListener,实现监听不同类型事件,不需要在acitivit中配置任务监听,非常方便
如果我们像给任务配置监听,按照常规的做法是这样的 一个个配置,比较麻烦. 现在利用ActivitiEventListener,监听全局事件,并且可以判断不同的事件类型,进而执行不同的业务逻辑. 1.定 ...
- [Linux] day04——Linux 入门
Linux 入门 =================Gnome 基于GTK图形库 速度快 稳定性好 专注与桌面本身 偏商务 RedHat企业版默认桌面KDE 基于QT 速度慢 软件多 习惯接近win ...
- 解压Assets.car获取App中的图片资源
iOS开发时图片资源(png)是放置在Images.xcassets文件夹中进行管理的. 项目归档后就是ipa文件,在ipa文件中,Images.xcassets文件夹的内容放置在了Assets.ca ...
- 【快学springboot】9.使用 @Transactional 注解配置事务管理
介绍 springboot对数据库事务的使用非常的方便,只需要在方法上添加@Transactional注解即可.Spring 为事务管理提供了丰富的功能支持.Spring 事务管理分为编程式和声明式的 ...
- [转]网络协议-redis协议
Redis 通信协议(protocol) 本文档翻译自: http://redis.io/topics/protocol . Redis 协议在以下三个目标之间进行折中: 易于实现 可以高效地被计算机 ...
- CSS去掉背景颜色
background-color:transparent;
- n/20 文本框动态监听输入长度
- yarn container 的日志路径
/etc/hadoop/conf/yarn-site.xml 配置文件中 - yarn.nodemanager.log-dirs 指定本机的日志路径 (/hadoopfs/fs1/yarn/nodem ...