爬取搜狗首页页面数据
import urllib.request
# 1.指定url
url = r'https://www.sogou.com/'
# 2.发起请求
# urlopen()参数内部可以指定填写url,且返回一个函数对象
res = urllib.request.urlopen(url=url)
# 3.获取页面数据
# 响应对象中会获取存储的数据,read()函数中返回的就是响应对象存储的页面数据
page_text = res.read()
print(page_text)
# 4.持久化存储
with open('./sogou.html', 'wb') as fp:
fp.write(page_text)
print('写入数据成功')
爬取指定词条数据
import urllib.request
import urllib.parse
# 1.指定url
url = r'https://www.sogou.com/web?query='
# 2.发请求 url中不可以存在ascii码的字符数据,否则就会报错,这里需要对中文进行转码和拼接后才能进行处理
word = urllib.parse.quote('人民币')
url = url+word
res = urllib.request.urlopen(url=url)
# print(word)
# 3.获取页面数据(二进制的页面数据)
page_text = res.read()
print(page_text)
# 4.持久化存储
with open('./renminbi.html', 'wb') as f:
f.write(page_text)
print('写入数据成功')
伪装UA
import urllib.request
url = 'http://www.baidu.com/'
# UA伪装
# 1.自制定一个请求对象
headers = {
# 存储任意的请求头信息
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
}
# 该请求对象进行了成功的伪装
req = urllib.request.Request(url=url, headers=headers)
# 2.针对自制定的请求对象发起请求
res = urllib.request.urlopen(req)
print(res.read())
爬取百度翻译的结果
import urllib.request
import urllib.parse
# 1.制定url
url = 'https://fanyi.baidu.com/sug'
# post请求所携带的参数处理流程
# 1.将请求参数封装到字典中
data = {
'kw': '西瓜',
}
# 2.使用parse中的url encode进行编码处理
data = urllib.parse.urlencode(data)
# 3.将步骤2的编码结果转换为byte类型
data = data.encode()
# 2.发起post请求
# urlopen中的data表示的就是经过处理之后的post的请求参数
req = urllib.request.urlopen(url=url, data=data)
# print(req.read())
with open('./百度翻译.txt', 'wb') as fp:
fp.write(req.read())
request发起get请求
# 爬取搜狗首页的数据
import requests
# 1.指定url
url = 'https://www.sogou.com/'
# 2.发起get请求
res = requests.get(url=url)
# 3.获取响应中的数据值
# text获取相应页面中的字符串形式
page_data = res.text
# print(page_data)
# 4.持久化操作
with open('./sougou.html', 'w', encoding='utf-8') as fp:
fp.write(page_data)
response其他重要属性
# 爬取搜狗首页的数据
import requests
# 1.指定url
url = 'https://www.sogou.com/'
# 2.发起get请求
res = requests.get(url=url)
# 3.获取响应中的数据值
# content获取的是response对象中的byte类型的页面数据
# print(res.content)
# status_code表示网页的响应状态码,返回响应状态码,查属性的结果,响应成功或失败
# print(res.status_code)
# 获取响应头信息(字典的形式)
# print(res.headers)
# 获取的是响应对象中的url,获取请求的url,返回的是请求中指定的url
# print(res.url)
处理携带参数的get请求
# 获取搜狗搜索结果对应页面数据
import requests
url = 'https://www.sogou.com/web?query=周杰伦&ie=utf-8'
res = requests.get(url=url)
# print(res.text)
with open('./Jay.html', 'w', encoding='utf-8') as fp:
fp.write(res.text)
处理携带参数的get请求2
# 获取搜狗搜索结果对应页面数据
import requests
url = 'https://www.sogou.com/web'
# 将参数封装到字典中
params = {
'query': '周杰伦',
'ie': 'utf-8',
}
res = requests.get(url=url, params=params)
# print(res.text)
with open('./Jay2.html', 'w', encoding='utf-8') as fp:
fp.write(res.text)
request模块的post请求
# 登录豆瓣网,获取登陆成功后的页面数据
import requests
# 指定url
url = 'https://accounts.douban.com/login'
# 封装post请求的参数
data = {
'source': 'movie',
'redir': 'https://movie.douban.com/',
'form_email': 'a873245193@sina.com',
'form_password': 'dota2009',
'login': '登录'
}
headers = {
# 存储任意的请求头信息
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
}
# 发起post请求
req = requests.post(url=url, data=data, headers=headers)
# 3.获取响应对象中的页面数据
page_text = req.text
# 4.持久化操作
with open('./douban.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)
requests模块ajax的get请求
import requests
url = 'https://movie.douban.com/j/chart/top_list?'
# 封装ajax中get请求携带的参数
params = {
'type': '13',
'interval_id': '100:90',
'action': '',
'start': '0',
'limit': '2000',
}
headers = {
# 存储任意的请求头信息
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
}
req = requests.get(url=url, params=params, headers=headers)
print(req.text)
requests模块处理ajax的post请求
# 爬取肯德基餐厅的位置数据
import requests
# 1.指定url
post_url = r'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
# 2.处理post请求的参数
data = {
'cname': '',
'pid': '',
'keyword': '江苏',
'pageIndex': '1',
'pageSize': '10',
}
headers = {
# 存储任意的请求头信息
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
}
req = requests.post(url=post_url, data=data, headers=headers)
print(req.text)
request模块综合练习
import requests
# 爬取搜狗、知乎某一个词条对应的一定范围表示的页面数据
# 获取前3页页面数据
# 1.指定url
url = 'https://zhihu.sogou.com/zhihu'
params = {
'query': '人工智能',
'page':'6',
'ie':'utf8',
}
headers = {
# 存储任意的请求头信息
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
}
req = requests.get(url=url, params=params, headers=headers)
# print(req.text)
with open('./人工智能.html', 'w', encoding='utf-8') as fp:
fp.write(req.text)
request模块的cookie操作
# cookie
# 基于用户的数据
# 爬取豆瓣网的个人主页页面数据
# cookie作用,服务端使用cookie来记录客户端的状态信息
# 1.执行登录操作
# 2.发起个人请求主页请求时,需要将cookie携带到该请求中
# session也可以使用来发起请求,该cookie对象会自动存储在session中
import requests
session = requests.session()
login_url = 'https://www.douban.com/accounts/login'
data = {
'source': 'movie',
'redir': 'https://movie.douban.com/',
'form_email': 'a873245193@sina.com',
'form_password': 'dota2009',
'login': '登录',
}
headers = {
# 存储任意的请求头信息
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
}
res = session.post(url=login_url, data=data, headers=headers)
print(res.text)
with open('./dou.html', 'w', encoding='utf-8') as fp:
fp.write(res.text)
requests模块的代理操作
# -代理操作,使用第三方代替本体去操作事务
# -为什么要使用代理?
# 反爬操作有关联
# 设置代理ip防止门户网站封禁ip,使用代理是一种反反爬的手段
# 代理分类
# -正向代理 代替客户端获取数据
# -反向代理 代替服务器端提供数据
# 4.免费代理ip的网站提供商
# -www.goubanjia.com
# -快代理
# -西祠代理
正则回顾
# 数据解析
# 1.指定url
# 2.发起请求
# 3.获取页面数据
# 4.数据解析
# 5.进行持久化存储
# 大多数页面都是聚焦爬取指定的内容,就需要就行数据解析
# 1.正则解析
# 2.bs4
# 3.xpath解析
# +----------------------------------------------+
# 正则表达式练习
import re
# 1.提取python
# key = "javapythonc++php"
# text = re.findall('python', key)
# print(text)
# 2.提取hello world
# key = "<html><h1>hello world</h1></html>"
# text = re.findall("<h1>(hello world)</h1>", key)[0]
# print(text)
# 3.提取170
# string = '我喜欢身高170的女孩'
# text = re.findall('\d+', string)[0]
# print(text)
# 4.提取http://和https://
# key = 'http://www.baidu.com and https://boob.com'
# text = re.findall('http://|https://', key)
# print(text)
# 5.提取hit.
# key = 'bobo@hit.edu.com'
# text = re.findall('@(hit).', key)[0]
# text1 =re.findall('h.*?\.', key) #贪婪模式,尽可能多的匹配,加问号就是切换为非贪婪模式
# print(text1)
# 6.匹配sas和saas
# key = 'saas and sas and saaas'
# text = re.findall('sa{1,2}s', key)
# print(text)
# 7.匹配出i开头的行
# re.M 作用在多行处 re.S 作用于单行处
# string = '''fall in love with you
# i love you much
# i love she
# i love her
# '''
# text = re.findall('^i.*', string, re.M)
# print(text)
# 8.匹配全部行
# string = '''<div>静夜思
# 床前明月光
# 疑是地上霜
# 举头望明月
# 低头思故乡
# </div>
# '''
# text = re.findall('<div>.*</div>', string, re.S)
# print(text)
正则解析项目演练
None
自定义请求头信息
import requests
# 自定义请求头信息
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
}
url = 'https://www.sogou.com/web'
# 将参数封装到字典中
params = {
'query': '周杰伦',
'ie': 'utf-8',
}
res = requests.get(url=url, params=params, headers=headers)
# print(res.text)
with open('./Jay3.html', 'w', encoding='utf-8') as fp:
fp.write(res.text)
xpath表达式回顾
# 1.下载lxml插件
# 2.导入包 from lxml import etree
# 3.创建etree,指定数据的解析
# -如果解析的数据源来源是本地的话,就需要etree.parse('本地文件路径)
# -etree.xpath('xpath表达式')
# -数据来源是来自网络的形式 etree=etree.HTML('网络请求到的数据')
from lxml import etree
tree = etree.parse(r'F:\爬虫专用\text.html')
# 属性定位:根据指定的属性定位到指定的节点标签
print(tree.xpath("//div[@class='song']"))
# 层级索引定位
print(tree.xpath("//div[@class='tang']/ul/li[2]/a"))
# 逻辑定位
print(tree.xpath("//a[@href='' and @class='du']"))
print(tree.xpath("//div[contains(@class, 'ng')]"))
# 模糊匹配
print(tree.xpath("//div[starts-with(@class, 'ta')]"))
# 取文本
print(tree.xpath("//div[@class='song']/p[1]/text()"))
xpath插件
# xpath插件可以直接将xpath的表达式作用于浏览器的网页当中
# 需要在谷歌浏览器中使用一个插件
xpath项目演练
# 使用xpath对段子网中的段子内容和标题进行爬取
# 进行持久化存储
import requests
from lxml import etree
# 1.指定url
url = 'https://ishuo.cn/joke'
# 2.发起请求
headers = {
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 "
"(KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
}
res = requests.get(url=url, headers=headers)
# 3.获取页面内容
page_text = res.text
# print(page_text)
# 4.数据解析
tree = etree.HTML(page_text)
# 获取所有的li标签
li_list = tree.xpath("//div[@id='list']/ul/li")
# print(tree.xpath("//div[@id='list']/ul/li"))
fp = open('./duanzi.txt', 'w', encoding='utf-8')
for li in li_list:
content = li.xpath("./div[@class='content']/text()")[0]
title = li.xpath("./div[@class='info']/a/text()")[0]
# print(title)
# 5.持久化存储
fp.write(title + ':' + content + '\n\n')
print('数据写入成功')
bs4基础使用
# beautifulsoup是python中独有的一种解析方式
# 使用的时候更加的简单便捷和高效
# 代码的使用流程
# 可以将html的文档转换为beautifulsoup的一个对象
# 调用对象的一些属性,对指定内容的一个定位于查找
from bs4 import BeautifulSoup
# 创建对象
# 如果html的本地来源是本地的话,Beautiful(open('文件'),'lxml')
# 如果html的来源是来自网络的,Beautiful('网络请求的数据','lxml')
# 属性和方法
fp = open(r'F:\爬虫专用\text.html', 'r', encoding='utf-8')
soup = BeautifulSoup(fp, 'lxml')
# print(soup)
# 根据标签名称进行查找
# print(soup.find('div'))
# 获取标签的属性值
# print(soup.a.attrs)
# 获取指定的属性值
# 获取的文本内容
# print(soup.p.text)
# 获取其他的内容
# print(soup.find('div', {'class': 'song'}))
tag_name = soup.find('div', {'class': 'song'}).find_all('p')
for tag in tag_name:
print(tag.text)
bs4项目演练
# 爬取古诗文网中的部分内容
import requests
from bs4 import BeautifulSoup
url = 'http://www.shicimingju.com/book/sanguoyanyi.html'
headers = {
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 "
"(KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
}
def get_content(url):
content_page = requests.get(url=url, headers=headers).text
soup = BeautifulSoup(content_page, 'lxml')
content_text = soup.find('div', {'class': 'chapter_content'}).text
return content_text
page_text = requests.get(url=url, headers=headers).text
soup = BeautifulSoup(page_text, 'lxml')
# print(soup.text)
te = soup.select('.book-mulu > ul > li > a')
# print(te)
for a in te:
# 获取了章节的标题
title = a.string
content_url = 'http://www.shicimingju.com' + a['href']
# print(title)
con = get_content(content_url)
print(con)
scrapy简介和基础使用01
# scrapy框架:
# 1.框架的简介和基础应用
# 2.持久化存储
# 3.代理和cookie
# 4.日志和请求传参
# 5.CrawlSpider
# 6.基于redis的分布式爬虫
# ===========================================
# 一、scrapy框架的简介和基础应用
# 1.概念:为了爬取网站数据而编写的一款应用框架、出名且强大
# 所谓的框架就是集成了相应的功能且具有很强通用性的项目模板(高性能的异步下载功能),可以开启多个异步进程,高性能持久化存储
scrapy简介和基础使用02
# 1.创建一个工程
# >>>scrapy startproject project_name
# 2.在工程目录下创建一个爬虫文件
# 3.对应的文件中编写爬虫程序来完成爬虫的操作
# 4.配置文件的编写
# 5.执行
# scrapy crawl 爬虫文件的名称(--nolog指的是阻止日志信息的输出)
# ====================================================
# scrapy.cfg 项目的主配置信息,真正的爬虫的配置信息是配置在settings.py文件中
# items.py 设置数据存储模板,用于数据化结构,像django的model
# pipelines.py 数据持久化处理
# settings.py 配置文件,如递归的层数,并发数,延迟下载等
# 1.对请求载体进行配置
# 2.不遵循robots.txt协议
# spiders 爬虫目录创建文件,爬虫的编写规则等
scrapy简介和基础使用03
# 爬虫页面的解析操作
# -需求:爬取糗事百科中段子的内容和段子的作者
# 1.创建一个工程项目scrapy startproject qiubai
#
基于终端指令的持久化存储
# 1.持久化存储
# 存储在磁盘文件中
# 基于终端指令的数据存储
# 保证parse方法返回一个可迭代的类型对象(存储解析到的页面内容)
# 使用终端指令完成数据存储到指定磁盘文件中的操作
# 基于管道的数据存储
基于管道的持久化存储
# items文件
# pipelines文件
# items表示的是数据存储的模板式文件
# pipelines文件处理持久化存储的相关操作
# 代码实现的流程
# 1.先将解析到的页面数据存储到items对象中
# 2.使用yield关键字将items对象提交给管道处理,yield可以提交关键字进行处理
# 3.在管道文件中编写代码完成数据存储的操作
# 4.在配置文件中开启管道的操作
#