Python爬虫之学习案例

Python爬虫

一、爬虫是什么

是一段代码,用于获取网页上的信息

几乎所有主流的高级程序设计语言都能实现爬虫

二、爬虫的实现原理

通过代码 模拟浏览器向服务器发送Http/Https/…请求

(服务器是无法判断请求来源的),然后对响应的HTML页面进行数据处理

  • 请求的发送
  • 响应数据的处理
  • 效率优化

三、HelloWorld

1、导入对应模块

java: class 文件是由 JVM 解释,运行的

​ JVM(JRE) 存在于 JDK 中

python: py文件 是由 Python解释器(interpreter)解释运行

​ Python的模块 是由 解释器中的pip模块安装的

  • urllib 模块

2、编写Python代码

# 从urllib模块中导入request子模块
from urllib import request

url = "http://www.baidu.com/"

req = request.Request(url)

html_code = request.urlopen(req).read()

html_text = str(html_code, "utf-8")

target = open("baidu.html", mode="w", encoding="utf-8")

target.write(html_text)

print("over...............")

四、一个完整的爬虫

# encoding=utf8
# 前程无忧 爬虫
__author__ = "崔译"

# 发送http、https请求
from urllib import request

# 用于解析处理HTML格式的字符串
from bs4 import BeautifulSoup

# 用于连接mysql数据库
import pymysql

# 用于连接redis数据库
import redis

# 用于Excel读写操作
from openpyxl import Workbook

# 导入time 模块
import time


# 确定要爬取的url
url = 'http://search.51job.com/list/070200,000000,0000,00,9,99,Java,2,{}.html'

# 模拟浏览器发送请求
# 模拟请求头信息
headers = {
    "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Language":"zh-CN,zh;q=0.8",
    "Connection":"keep-alive",
    "Host":"search.51job.com",
    "Referer":"http://search.51job.com/list/070200,000000,0000,00,9,99,Java,2,4.html",
    "Upgrade-Insecure-Requests":"1",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36"
}


# 进行爬取操作
def do_spider(page_no=1):
    # 创建请求对象,并且同时设置请求头
    req = request.Request(url.format(page_no), headers=headers)
    # 打开创建的请求,并读取响应的数据
    # 读取到的是bytes 类型
    html_bytes = request.urlopen(req).read()
    # print(type(html_bytes)) # =><class 'bytes'>
    # 将读取的内容转成str类型
    # str 将任意类型转换为字符串类型,第二个参数是字符集
    # 对于爬虫而言,该字符集是 爬取的网站的字符集
    html_code = str(html_bytes, "gbk")

    # file = open("template.html",mode="w",encoding="gbk")
    # file.write(html_code)
    return html_code


# 测试方法
def load_html():
    file = open("template.html",encoding="gbk")
    html_code = file.read()
    return html_code;


# 解析html
def parse_html(html):
    # 方式1  使用正则表达式
    # 方式2  使用Xpath  是爬虫框架scrapy 所必须的技术
    # 方式3  使用 Python 第三方模块 Beautifulsoup ==> bs4
    #               能够将html语法的字符串进行解析,使用其中的方法来处理html

    # 解析参数
    soup = BeautifulSoup(html, "html.parser")
    # print(type(soup))
    # 以下所有的方法都可以用于BeautifulSoup或者Tag类型

    # find("标签名") 返回第一个对应的标签  相当于  .标签名
    # print(soup.find("input"))
    # print(soup.input)


    # find_all() 用法和find一致,只是返回的是所有的满足条件的标签,包括子标签
    # print(soup.find_all("input"))
    # div = soup.find_all("div")[1]
    # print(div[1])
    # div_in = div.find_all("div")[0]
    # print(div_in)

    # select() 参数是Css选择器 返回的是 列表
    # 所有的css选择器都能用
    # fot = soup.select(".footer .nag")
    # print(fot)

    # get_text() 获取标签内容 获取标签中的所有文字,包括子标签中的文字
    # text = soup.select("#area_channel_layer .tle")[0].get_text()
    # print(str(text).strip())

    result_list = []
    content_div = soup.select("#resultList")[0]
    item_divs = content_div.select(".el")

    # 去除表头,由于range 本身就是左闭右开,所以不需要len-1
    for item_div_index in range(1,len(item_divs)):
        # 对应一条数据
        item_div = item_divs[item_div_index]
        # print(item_div.get_text().strip())
        # job = item_div.p.get_text().strip()
        spans = item_div.find_all("span")
        # 将数据封装成 字典
        result_item = {
            "job": spans[0].get_text().strip(),
            "company": spans[1].get_text().strip(),
            "address": spans[2].get_text().strip(),
            "salary": spans[3].get_text().strip(),
            "publishDate": spans[4].get_text().strip()
        }
        # 将字典(每条数据) 放到列表中
        result_list.append(result_item)
    return result_list


# 存储到mysql
def export_to_mysql(result):
    # 创建 连接信息的 字典
    config = {
        "host": "localhost",
        "port": 3306,  # 默认是3306,可以不写
        "user": "root",
        "passwd": "",
        "db": "python",
        "charset": "gbk"
    }
    # 获取Connection
    db = pymysql.connect(**config)
    # 获取游标对象(cursor), 其实对应PreparedStatement对象
    cursor = db.cursor()
    try:
        # 遍历参数中的所有的数据
        for item in result:
            # 创建sql语句
            sql = '''
                insert into
                    t_jobs
                    (job,address,salary,company,publishDate)
                values 
                    ('%s','%s','%s','%s','%s')                  
            ''' % (item['job'],item['address'],item['salary'],item['company'],item['publishDate'])

            # 执行sql语句
            cursor.execute(sql)
        db.commit()
    except Exception as e:
        print(e)

        db.rollback()
    db.close()


# 将数据导出到redis
def export_to_redis(result):
    # 连接到redis
    r = redis.Redis(host="localhost",port=6379,db=0,charset="gbk")
    for item in result:
        r.lpush("jobs", str(item))


# 从redis读取数据
def read_from_redis():
    r = redis.Redis(host="localhost", port=6379, db=0, charset="gbk" , decode_responses=True)
    print(r.lrange("jobs",0,-1))


# 导出到Excel文件中
def export_to_excel(result):
    # 创建工作表
    wb = Workbook()
    # 创建worksheet

    sheet = wb.create_sheet("招聘信息",0)
    # 向表格中添加一行数据
    # 参数是一个list
    sheet.append(["职位名","公司名","工作地点","薪资","发布时间"])
    # 写入数据
    for item in result:
        sheet.append([item['job'],item['company'],item['address'],item['salary'],item['publishDate']])

    # 将工作簿保存到本地文件系统
    wb.save("export.xlsx")



# code = do_spider()
code = load_html()
# print(code)
result = parse_html(code)
# print(result)
# export_to_mysql(result)
# export_to_redis(result)
# read_from_redis()
export_to_excel(result)
print("success..................")


# 完善代码,实现每4秒抓取一个页面。抓取前5页
# 将数据导出

# encoding=utf8
# 前程无忧 爬虫
__author__ = "崔译"

# 发送http、https请求
from urllib import request


# 用于解析处理HTML格式的字符串
from bs4 import BeautifulSoup

# 用于Excel读写操作
from openpyxl import Workbook

import requests


# 确定要爬取的url
url = 'http://search.51job.com/list/070200,000000,0000,00,9,99,Java,2,{}.html'

# 模拟浏览器发送请求
# 模拟请求头信息
headers = {
    "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Language":"zh-CN,zh;q=0.8",
    "Connection":"keep-alive",
    "Host":"search.51job.com",
    "Referer":"http://search.51job.com/list/070200,000000,0000,00,9,99,Java,2,4.html",
    "Upgrade-Insecure-Requests":"1",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36"
}


def get_proxy():
    return requests.get("http://127.0.0.1:5010/get/").content


def do_spider(page_no=1):
    # req = request.Request(url.format(page_no), headers=headers)

    # 创建一个代理
    proxy = request.ProxyHandler({
        "sock5":get_proxy()
    })
    # 创建
    opener = request.build_opener(proxy)
    # 注册opener
    request.install_opener(opener)

    html_bytes = request.urlopen(url.format(page_no)).read()
    html_code = str(html_bytes, "gbk")
    print("爬取到第{}页数据".format(page_no))
    return html_code



# 解析html
def parse_html():
    result_list = []
    page_no = 1
    while True:
        html = do_spider(page_no)
        soup = BeautifulSoup(html, "html.parser")

        content_div = soup.select("#resultList")[0]
        item_divs = content_div.select(".el")
        if len(item_divs) <= 1:
            break
        for item_div_index in range(1,len(item_divs)):
            item_div = item_divs[item_div_index]
            spans = item_div.find_all("span")
            result_item = {
                "job": spans[0].get_text().strip(),
                "company": spans[1].get_text().strip(),
                "address": spans[2].get_text().strip(),
                "salary": spans[3].get_text().strip(),
                "publishDate": spans[4].get_text().strip()
            }
            result_list.append(result_item)
        page_no += 1
    return result_list


# 导出到Excel文件中
def export_to_excel(result):
    # 创建工作表
    wb = Workbook()
    # 创建worksheet

    sheet = wb.create_sheet("招聘信息",0)
    # 向表格中添加一行数据
    # 参数是一个list
    sheet.append(["职位名","公司名","工作地点","薪资","发布时间"])
    # 写入数据
    for item in result:
        sheet.append([item['job'],item['company'],item['address'],item['salary'],item['publishDate']])

    # 将工作簿保存到本地文件系统
    wb.save("export.xlsx")


# code = do_spider()
# export_to_excel(result)
# print("success..................")


result = parse_html()
export_to_excel(result)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值