轻松利用Python爬虫爬取你想要的数据

网络爬虫的基本工作流程如下:

1.首先选取一部分精心挑选的种子URL。

2.将这些URL放入待抓取URL队列。

3.从待抓取URL队列中读取待抓取队列的URL,解析DNS,并且得到主机的IP,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL队列。

4.分析已抓取URL队列中的URL,从已下载的网页数据中分析出其他URL,并和已抓取的URL进行比较去重,最后将去重过的URL放入待抓取URL队列,从而进入下一个循环。

  • 下面我们用BS4 解析库来爬取想要的数据
    作用:用来解析网页,提取指定数据的。提供的接口非常简单。使用起来人性化。所以用的比较多,但是bs4只能解析html格式的数据
    首先我们先在小黑窗安装:
pip install bs4

整体使用步骤:
bs4里面有一个类,BeautifulSoup,然后通过这个类将网页html格式字符串生成一个对象,然后通过对象的方法来进行查找指定元素

* (1)将本地html文件转化为对象

soup = BeautifulSoup(open('soup.html', encoding='utf8'), 'lxml')

* lxml :

是一个文件解析库,通过它的解析生成对象,是一个第三方库,需要安装
更上面一样打开小黑窗属于下面代码安装:

 pip install lxml

html.parser :
是python自带的一个文件解析库

* eg:

soup = BeautifulSoup(open(‘soup.html’, encoding=‘utf8’), ‘lxml’)

根据标签名查找

soup.a 只能查找得到第一个符合要求的节点,是一个对象,bs4自己封装类的对象

* 获取属性

  • soup.a.attrs 获取得到所有属性和值,是一个字典
  • soup.a.attrs[‘href’] 获取指定的属性值
  • soup.a[‘href’] 简写形式

* 获取文本

  • soup.a.string
  • soup.a.text
  • soup.a.get_text()

[注]如果标签里面还有标签,那么string获取就是空,而后两个获取的是纯文本内容

find_all方法

返回的是一个列表,列表里面都是节点对象

  • soup.find_all(‘a’) 找到所有a
  • soup.find_all(‘a’, limit=2) 提取符合要求的前两个a
  • soup.find_all([‘a’, ‘li’]) 查找得到所有的a和li
  • soup.find_all(‘a’, class_=‘xxx’)查找得到所有class是xxx的a
  • soup.find_all(‘li’, class_=re.compile(r’^xiao’))
查找所有的class以xiao开头的li标签

select方法

  • id选择器 #dudu
  • 类选择器 .xixi
  • 标签选择器 div a h1

eg :

  • div #dudu .xixi a
空格:代表后面的节点是前面节点的子节点或者子孙节点
  • div > #dudu > a > .xixi

: 代表后面的节点是前面节点的子节点
返回的是一个列表,列表里面都是符合要求的节点对象
普通对象也能调用select方法,查找的是这个对象下面的内容

  • 下面来爬去三国演义小说:

实例1

爬取三国演义小说保存到文件

import urllib.request
from bs4 import BeautifulSoup
import time

def handle_request(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    }
    request = urllib.request.Request(url,headers=headers)
    return request

def parse_content(content,fp):
    # 生成soup对象
    soup = BeautifulSoup(content,'lxml')
    # 查找所有的章节链接和标题内容
    oa_list = soup.select('.book-mulu > ul > li > a')
    # print(len(oa_list))
    # 遍历列表,依次获取每一个链接和内容
    for oa in oa_list:
        # 获取链接
        href = 'http://www.shicimingju.com' + oa['href']
        # 获取标题
        title = oa.string
        print('正在下载--%s--......' % title)
        # 获取章节内容函数
        text = get_text(href)
        # 写入文件
        fp.write(title + '\n' + text)
        print('结束下载--%s--' % title)
        time.sleep(2)

# 提取得到章节内容
def get_text(href):
    # 构建请求对象
    request = handle_request(href)
    content = urllib.request.urlopen(request).read().decode('utf8')
    # 生成soup对象
    soup = BeautifulSoup(content,'lxml')
    # 查找包含内容的div
    odiv = soup.find('div',class_='chapter_content')
    return odiv.text

def main():
    # 打开文件
    fp = open('三国演义.txt','w',encoding='utf8')
    url = 'http://www.shicimingju.com/book/sanguoyanyi.html'
    # 构建请求对象
    request = handle_request(url)
    # 发送请求,得到响应
    content = urllib.request.urlopen(request).read().decode('utf8')
    # 解析内容即可
    parse_content(content,fp)
    fp.close()

if __name__ == '__main__':
    main()

实例2

爬取51job求职网 保存到数据库

import urllib.request
from bs4 import BeautifulSoup
import time
import pymysql
def headers_request(url):
    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36'
}
    request=urllib.request.Request(url,headers=headers)
    return request
# 解析内容
def parse_content(content, db):
    # 生成soup对象
    soup = BeautifulSoup(content,'lxml')
    # 先找包含所有工作的div
    odivbox = soup.find('div',id='resultList')
    # 首先找到包含所有工作的div
    odiv_list = odivbox.find_all('div',class_='el')[1:]
    # print(len(odiv_list))
    for odiv in odiv_list:
        # 职位名称
        jobname = odiv.select('.t1 > span > a')[0]['title']
        # 公司名称
        company = odiv.select('.t2 > a')[0]['title']
        # 工作地点
        area = odiv.select('.t3')[0].string
        # 职位月薪
        salary = odiv.select('.t4')[0].string
        # 发布时间
        publish_time = odiv.select('.t5')[0].string
        # print(salary, publish_time)
        # 保存到字典中
        item = {
            '职位名称':jobname,
            '公司名称':company,
            '工作地点':area,
            '职位月薪':salary,
            '发布时间':publish_time
        }
        # 保存到文件中
        # string = str(item) + '\n'
        # fp.write(string)

        # 保存到mysql中
        save_to_mysql(db,item)

def save_to_mysql(db,item):
    # 获取游标
    cur = db.cursor()
    # 执行sql语句
    sql = """insert into work(jobname,company,area,salary,publish_time) values('%s','%s','%s','%s','%s')""" % (item['职位名称'], item['公司名称'], item['工作地点'], item['职位月薪'], item['发布时间'])
    # print(sql)
    try:
        cur.execute(sql)
        #提交
        db.commit()
    except Exception as e:
        # print(e)
        #错误回滚
        db.rollback()

def main():
    # fp = open('work.txt','w',encoding='utf8')
    # 链接数据库
    db = pymysql.connect(host="xxxx",user="xxxx",password="xxxxxx",db="xx",port=xxxx,charset='utf8')
    # 用户输入要搜索工作关键字
    keyword = input('请输入要搜索的关键字-')
    # 用户输入要爬取的起始和结束页码
    start_page = int(input('请输入要爬取的起始页码-'))
    end_page = int(input('请输入要爬取的结束页码-'))
    # 要拼接的起始url
    url = 'https://search.51job.com/list/010000,000000,0000,00,9,99,{},2,{}.html'
    # 写循环,每一页开始挨着爬取
    for page in range(start_page,end_page + 1):
        print('正在爬取第%s页......' % page)
        # 拼接url
        url_page = url.format(keyword,page)
        # print(url_page)
        # 构建请求对象
        request = headers_request(url_page)
        # 发送请求,得到响应
        content = urllib.request.urlopen(request).read().decode('gbk')
        # 解析内容
        parse_content(content,db)
        print('结束爬取第%s页' % page)
        time.sleep(2)
    # fp.close()
    db.close()

if __name__ == '__main__':
    main()
  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值