8月31日爬虫笔记汇总,有不明白的欢迎提问交流。
#如有不当之处欢迎大佬指正#
提示:以下是本篇文章正文内容,下面案例可供参考
流程分析:
网址: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)
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__ =(.*?)', 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
操作流程:
查看谷歌浏览器版本、去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>
该处使用的url网络请求的数据。
--------------------------------- 爬取纳兰无敌 ------------------------------
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('(.*?)
', 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')
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'))
#
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()) #获取文本
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) #获取响应内容
https://www.csdn.net
https://www.cnblogs.com
简书
https://gitee.com
https://github.com 拥有全球开源的项目
https://stackoverflow.com
google、bing、magi.com、baidu
第一步:搜索思维
1、了解目的: 爬虫
2、限定语言: python
3、限定站点: cnblogs
第二步:大概浏览一下,搜索出来的top10页涉及到的具体技术有哪些
这门技术可能会涉及哪些第三方包
一线大厂。技术委员会,开源委员会
第三步:python + 第三方包包名,看一下帮助文档
哪个看上去简单,就用哪个
技术预研: 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)请求的内容[可以没有]
获取响应
爬虫软件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”, 获取文本,就获得了价格:
用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 开始装包
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>这是一个大标题</title>
</head>
<body>
这里是内容
<br><br>换行
HTML标签语言:基本格式<标签的名称 标签的属性1="属性值" 标签的属性n="属性值"></标签的名称>>
<br><br><br><br><br><br>
用户名:<input name="username" maxlength="5">
<br><br>
按钮:<button id="login">登录按钮</button>
<br><br>
单选按钮 <input type="radio" name="sex">男
<input type="radio" name="sex">女
<br><br><br><br>
复选按钮 <input type="checkbox" name="love">吃
<input type="checkbox" name="love">喝
<input type="checkbox" name="love">玩
<br><br><br><br>
下拉框 <select name="city"><option>深圳</option><option>上海</option></select>
<br><br><br><br>
连接 <a href="https://www.baidu.com">百度一下,就不告诉你</a>
</body>
</html>