前言
8月31日爬虫笔记汇总,有不明白的欢迎提问交流。 #如有不当之处欢迎大佬指正#
提示:以下是本篇文章正文内容,下面案例可供参考
一、爬虫实例
0.爬取深圳租房信息
流程分析:
-
网址:http://zf.szhome.com/Search.html?sor=2&page=1 -
步骤: 1)第一步找到所有class="lpinfo"的行信息 2)在第1步的基础上找到class=“left esf-info” 3)在2的基础上找到第2个p,获取文本,获得户型 4)在第1步的基础上找到class=“right esf-pri” 5)在第4步的基础上找到class=“red f20”,获取文本,就获得了价格
import requests
from bs4 import BeautifulSoup
for page in range(1,9):
with open('深圳房租信息.txt','a',encoding='utf-8') as f:
r = requests.get("http://zf.szhome.com/Search.html?sor=2&page=%d" % page) # 发送请求
content = r.text # 获取响应html文本
# print(content)
soup = BeautifulSoup(content, 'html.parser') #解析网页内容,指定BeautifulSoup解析器为'html.parser'
# 根据某个标签的属性,查找所有标签
rows = soup.find_all(attrs={'class': 'lpinfo'}) #是一个多行
for row in rows:
left = row.find(attrs={'class':'left esf-info'})
ps = left.find_all('p')#找到left...下面所有的<p>标签
info = ps[0].get_text()
info = info.split('|')
print(info)
#找价格
right = row.find(attrs={'class': 'right esf-pri'})
price = right.find(attrs={'class': 'red f20'}).get_text()
info.append(price)
f.writelines(','.join(info))#1次写多行
f.write('\n')
补充内容:格式化字符串
# 格式化字符串。因为有时候需要动化处理
# %s,字符串在这里,需要一个字符串
# %f,浮点数
# %d,正整数
s = '%s今天吃了%s,花了多少钱%.2f,今天星期%d' % ('wahaha','包子',2.43,3)
print(s)
1.爬取深圳算法岗位信息
import requests
import re
import json
import pandas
job_name_list = []
company_name_list = []
providesalary_text_list = []
workarea_text_list = []
degreefrom_list = []
work_year_list = []
jobwelf_list =[]
companysize_text_list = []
companyind_text_list = []
################# 以下选中区域为主要爬取分析代码 ##############
##获取网页包头并赋值给headers[^1]
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"}
##for循环设定动态URL地址
##剩下的四行代码是获取需要的信息,并格式化。主要通过分析谷歌浏览器网页中检查里的 Element 内容以及 对这四行代码的调试分析自己所需内容的位置。可通过修改关键字直接调用
for x in range(1, 58):
url = "https://search.51job.com/list/040000,000000,0000,00,9,99,%25E7%25AE%2597%25E6%25B3%2595%25E5%25B7%25A5%25E7%25A8%258B%25E5%25B8%2588,2,{}.html?lang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=".format(x)
rsp = requests.get(url, verify=False, headers=headers)
result = re.findall('window.__SEARCH_RESULT__ =(.*?)</script>', rsp.text)
result = json.loads(result[0])
engine_search_result = result.get('engine_search_result')
################# 将爬取的内容分别写入创建的空列表 ###############
for engine in engine_search_result:
job_name_list.append(engine.get('job_name'))
company_name_list.append(engine.get('company_name'))
providesalary_text_list.append(engine.get('providesalary_text))
workarea_text_list.append(engine.get('workarea_text'))
degreefrom_list.append(engine.get('degreefrom'))
work_year_list.append(engine.get('workyear'))
jobwelf_list.append(engine.get('jobwelf_list'))
companysize_text_list.append(engine.get('companysize_text'))
companyind_text_list.append(engine.get('companyind_text'))
#将转行成一个二维数据。列名是‘职位名称’,列的数据是job_name_list
data = pandas.DataFrame({'职位名称': job_name_list,
'公司名称': company_name_list,
'工资': providesalary_text_list,
'地点': workarea_text_list,
'学历': degreefrom_list,
'工作年限': work_year_list,
'福利待遇': jobwelf_list,
'公司规模': companysize_text_list,
'行业类型': companyind_text_list
})
data.to_excel('深圳地区算法工程师情况调查表.xls')
用到的库: request ;re ;json ;pandas 操作流程:
- 谷歌浏览器中指定网页,右击【检查】查询并分析当前内容信息,并获取网页包头[^1]信息
- 通过正则表达式获取内容,并通过代码调试分析下一层以便获取新的信息
[^1]包头headers:谷歌浏览器中指定网页,右击【检查】,在【Network】中刷新网页,左边第一个文档中找到内容【User-Agent: xxxx】的信息,复制内容以字典形式将其赋值给 headers
2.爬取猫图片(基于 selenium库 模拟人自动点击)
查看谷歌浏览器版本、去http://npm.taobao.org/mirrors/chromedriver/下载对应的exe软件并解压到某路径
代码如下(示例):
import requests
# pip install selenium
from selenium import webdriver
import time
for x in range(1, 3):
# 打开浏览器,用chromedriver.exe插件
wd = webdriver.Chrome(executable_path=r'D:\z\AI\爬虫\爬取工具\chromedriver_win32\chromedriver.exe')
time.sleep(1)
# 访问某个网址
wd.get('https://www.pexels.com/search/cat/?page={}'.format(x))
time.sleep(3)
# 根据xpath的语法,一次性查找多个img标签
imgs = wd.find_elements_by_xpath('//article/a/img')
for img in imgs:
# 根据标签的属性来获取某个值
url = img.get_attribute('src')
if url:
# verify,因为是https请求,verify=False,不进行ssl安全认证
rsp = requests.get(url, verify=False)
# ./,指当前目录
with open('./img/%d.png' %(int(time.time())), 'wb') as f:
# 将响应内容转换成二进制内容
f.write(rsp.content)
time.sleep(10)
# 退出浏览器
wd.quit()
1.找到img这个控件,然后获取src这个属性的值 2.利用requests发送src这个url地址,另存为一个图片就可以了 3.article下面的a,再下面的img
< html> < div name=‘a123’ > < /div> < sex> 男 < /sex> < name> wahaha < /name> < /html>
- xpath 最基本的表示方法:
/ 代表绝对路径, /标签的名称 /html/sex // 代表相对路径,//标签的名称 //sex, /html//sex //标签的名称[@属性=属性值] //div[@name=‘a123’]
该处使用的url网络请求的数据。
3.爬取小说纳兰无敌并生成词云
--------------------------------- 爬取纳兰无敌 ------------------------------
import requests
import re
with open('斗破苍穹之纳兰无敌.txt', 'a') as f:
for x in range(0, 50):
rsp = requests.get('http://www.doupoxs.com/nalanwudi/{}.html'.format(2752 + x))
rsp.encoding = rsp.apparent_encoding
# 以<p>开头,</p>结束
result = re.findall('<p>(.*?)</p>', rsp.text)
result = result[1:len(result) - 1]
f.writelines(result)
---------------------- 纳兰无敌 指定轮廓词云生成 --------------------------
import jieba.analyse
from wordcloud import WordCloud
from imageio import imread
with open('斗破苍穹之纳兰无敌.txt', 'r') as f:
# 获取小说文本信息
text = f.read()
# 把文本信息中的词语,进行分词分析
tags = jieba.analyse.extract_tags(text, topK=50, withWeight=True)
# 创建一个文本文件,存储分词获取的关键字
with open('word.txt', 'a') as f1:
for tag in tags:
f1.write('{0}\t{1}\n'.format(tag[0], int(tag[1] * 1000)))
# 生成指定轮廓词云图 C:\Windows\Fonts rgb颜色(百度):#561256
wc = WordCloud(font_path='ygyxsziti2.0.ttf',
width=600, height=800,
background_color='#561256',
mask=imread(r'C:\Users\Administrator\Desktop\ca.jpg') # 自己路径的一个图片文件
)
with open('word.txt', 'r') as f2:
wc.generate(f2.read())
wc.to_file('2.png')
二、用到的库
1.正则表达式 re 库
re库 : 从字符串提取满足某规则的字符
# 正则表达式:从字符串提取满足某规则的字符
# web 前端开发,有一个正则库
import re
################## 指定字符串查找 ##############################
str1 = 'ab,Fafcacd,Fefgfgagfabac'
#以b和c开头,中间只有一个字符
r1 = re.findall('b.c',str1) # . 只代表中间一个字符
#以a开头,后面字符串在[]中选一个
r2 = re.findall('a[afdfrgzx]',str1)
print(r1,r2)
############### 提取 数字 ##################
#\d 代表数字,字符串中提取数字
print(re.findall('\d','a,234f253'))
############## 提取 替换 非数字字符 ###################
#re.sub() 按照某种规则,进行字符串替换
#\D 匹配任意非数字字符
str2 = '4ajkgdj,44746'
print(re.sub('\D','',str2)) #将str2 里的非数字字符替换为''
print(re.findall('\w+', str2))
############# 筛选以aa开头aa结尾的中间所有字符串 ###########
print(re.findall('aa(.*?)aa', 'aabcfssaadfs'))
#
2.BeautifulSoup 库
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
# from bs4 import BeautifulSoup
# soup = BeautifulSoup(html_doc, 'html.parser')
#
# #print(soup.prettify()) #格式化 html字符串
#
# print(soup.find_all('a')) #获取单个内容
# print(soup.find(id='link3')) #单个查找
# #print(soup.get()) #获取属性
# print(soup.get_text()) #获取文本
3.request库
import requests
#发送请求
# 1)请求的方法名称 地址 协议的版本
# 2)请求的包头(地址浏览器基础信息发给服务器)
# 3)请求的内容[可以没有]
#
# r = requests.get('https://api.github.com/events')
#
# #获取响应
# print(r.status_code) #获取响应状态码
# print(r.headers) #获取响应的包头
# print(r.text) #获取响应内容
# print(r.content) #获取响应内容,以二进制形式
# print(r.json()) #
# 补充:
# import json #json 字符串与dict之间的转换
# c = {"data":[{"count":1},{"count":2}]}
#
# print(json.dumps(c),type(json.dumps(c)))
#
# cc = """{"data":[{"count":1},{"count":2}]}""" # 字符串转化成字典必须为双引号
#
# print(json.loads(cc),type(json.loads(cc)))
################## 各种发送请求 ###################################
# get:获取资源数据
# post:用来提交内容
# put:用来修改内容
# delete:删除内容
#
# r = requests.get('https://api.github.com/events')
# r = requests.post('http://www.baidu.conm', data = {'key':'value'})
# r = requests.put('http://www.baidu.conm', data = {'key':'value'})
# r = requests.delete('http://news.baidu.com/')
# r = requests.head('http://news.baidu.com/')
# r = requests.options('http://news.baidu.com/')
##########################################################
# 举例2:
#
# r = requests.put('http://www.baidu.com', data = {'key':'value'})
#
# print(r.status_code) #获取响应状态码
# print(r.headers) #获取响应的包头
# print(r.text) #获取响应内容
三、其他内容
1、常用网址
https://www.csdn.net https://www.cnblogs.com 简书 https://gitee.com https://github.com 拥有全球开源的项目 https://stackoverflow.com
google、bing、magi.com、baidu
2、重要点
第一步:搜索思维
1、了解目的: 爬虫
2、限定语言: python
3、限定站点: cnblogs
第二步:大概浏览一下,搜索出来的top10页涉及到的具体技术有哪些
这门技术可能会涉及哪些第三方包
一线大厂。技术委员会,开源委员会
第三步:python + 第三方包包名,看一下帮助文档
哪个看上去简单,就用哪个
技术预研: 3天 - 两周 时间可申请
3、爬虫三大步骤
1、发送http请求 -》搜:python 发送http请求
httplib,urllib,request -》看哪个简单,搜:python request
2、解析网页的内容
正则表达式大法,BeautifulSoup,lxml
3、保存内容
############################ 1、http是什么?
1.0 如何安装第三方包
1.1 request库
2.网页的构成是什么? 2.0 大概了解一下HTML常见的网页内容是怎么样的 2.1 怎么分析一个Web网页 2.1 BeautifulSoup 库
########################
发送请求 1)请求的方法名称 地址 协议的版本 2)请求的包头(地址浏览器基础信息发给服务器) 3)请求的内容[可以没有]
获取响应
- 响应状态码 协议版本
2)响应的包头(服务器基础信息) - 响应的内容[可以没有]
爬虫软件Fiddler使用:
tools - options - https - 勾选decrypt https traffic 安装证书
打开一个网页 - 右边页面选择 Inspectors - 左边选择一个蓝色或绿色 https
Inspectors下选择 Raw - 下面继续选择 Raw - view in notepad 打开文本
请求的方法:
GET :获取资源查询数据 HTTP/1.1 :协议的版本 POST :提交内容给服务端 PUT :修改 DELETE :删除某个内容 URL中:前面的部分叫路由器地址,请求的参数
响应状态码常见: 200:服务端接收到这个信息并成功处理 301,302:重定向,中转 404:找不到网址 500:服务端内部错误
2xx:成功处理 3xx:重定向 4xx:客户端错误 5xx:服务端错误
##################爬虫三大步骤二:解析网页内容########### 1、 HTML 语言:网页的控件内容 CSS 语言:样式美不美 JAVA script:交互动作
2、 http://zf.szhome.com/Search.html?sor=2&page=1
1.第一步找到所有lpinfo的行信息
2.在第1步的基础_上找到class=" left esf-info"
3.在2的基础上找到第2个p,获取文本,获得户型
4.在第1步的基础上找到class=’ right esf-pri’
5.在第4步的基础上找到class=" red f20”, 获取文本,就获得了价格:
4、关于python的快速安装
用python自带的 anaconda 集成开发环境
下载的地址都在国外,太慢了
1.where pip 2.pip 国内源 conda 国内源
用国内源装python库: 1、cmd -> where pip 2、输入:pip config set global.index-url http://mirrors.aliyun.com/pypi/simple/ 3、复制 地址 粘贴地址 4、修改txt文件内容为: [global] index-url = http://mirrors.aliyun.com/pypi/simple/
[install] trusted-host = mirrors.aliyun.com 5、cmd 输入 pip install requests 开始装包
|