python爬虫实例方法(批量爬取网页信息基础代码)

文章目录

  • 前言
  • 一、爬虫实例
    • 0.爬取深圳租房信息
    • 1.爬取深圳算法岗位信息
    • 2.爬取猫图片(基于 selenium库 模拟人自动点击)
    • 3.爬取小说纳兰无敌并生成词云
  • 二、用到的库
    • 1.正则表达式 re 库
    • 2.BeautifulSoup 库
    • 3.request库
  • 三、其他内容
    • 1、常用网址
    • 2、重要点
    • 3、爬虫三大步骤
    • 4、关于python的快速安装
    • 5、web前端基础


前言

8月31日爬虫笔记汇总,有不明白的欢迎提问交流。
#如有不当之处欢迎大佬指正#


提示:以下是本篇文章正文内容,下面案例可供参考

一、爬虫实例

0.爬取深圳租房信息

流程分析:

  1. 网址:http://zf.szhome.com/Search.html?sor=2&page=1

  2. 步骤:

    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__ =(.*?)', 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]信息
  2. 通过正则表达式获取内容,并通过代码调试分析下一层以便获取新的信息
[^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()
  • 怎么在html中查找某个控制的html标签

1.找到img这个控件,然后获取src这个属性的值
2.利用requests发送src这个url地址,另存为一个图片就可以了
3.article下面的a,再下面的img

  • xpath语法:

< 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('

(.*?)

'
, 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)请求的内容[可以没有]


获取响应

  1. 响应状态码 协议版本
    2)响应的包头(服务器基础信息)
  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 开始装包

5、web前端基础

<!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>




















你可能感兴趣的:(python,爬虫)