爬虫(spider)_获取网页内容_数据筛选_存储

spider(爬虫)_获取网页

一 . requests

  • pip install requests
  • import request

1. get

res = requests.get('http://www.baidu.com')

print(res)          # 网页对象
print(res.text)     # utf-8类型文本
print(res.content)  # byte类型的数据
print(res.content.decode('GBK'))    # GBK类型的数据

2. post

import re
import requests

url = 'http://www.heibanke.com/lesson/crawler_ex01/'
jsondata = {
    'username': 'test',
    'password': ''
}

for i in range(31):
    jsondata['password'] = i
    req2 =requests.post(url, data=jsondata)
    if '您输入的密码错误' not in req2.text:
        print('密码是:', i)
        break

3 . headers

def get_html(url):
    headers = {
        'User-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 '  
                      '(KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36'
    }
    res = requests.get(url, headers=headers)
    return res.text

4. 使用代理

5. 补充说明

  • 在很多需要登录认证的情况下,需要带上cookie和埋点

  • 针对有些网站还需要使用代理池,随机User-agent

二. urllib(py自带)

import urllib.request
import urllib.error
import urllib.response
import urllib.parse

1. get

response = urllib.request.urlopen('http://www.baidu.com')
# read 读取 decode 解码
print(response.read().decode())

2. post

# 在urlopen中有 data参数 只要使用data 就是post请求

3. headers

headers = {
    'User-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36'
}
req = urllib.request.Request('http://www.baidu.com',
                             headers=headers)

4. 使用代理

proxyHandler = urllib.request.ProxyHandler({
    'https': 'https://220.168.52.245:55255'
})

opener = urllib.request.build_opener(proxyHandler)

response = opener.open(fullurl='http://www.baidu.com/s?wd=Python')
print(response.read().decode('utf8'))

spider(爬虫)_数据筛选

一 . re(正则)

1.正则符号

.   - 匹配任意字符
\w  - 匹配一个ASCII表中字母、数字、下划线,还可以匹配一个所有非ASCII表字符
\s  - 匹配一个空白字符
\d  - 匹配一个数字字符
\b  - 检测单词边界(检测\b所在的位置是否是单词边界)
^   - 检测是否是字符串开头
$   - 检测是否是字符串结尾
\W  - 匹配非数字、字母、下划线
\S  - 匹配非空白字符
\D  - 匹配非数字字符
\B  - 检测是否是非单词边界
[]   - 匹配一个中括号中的任意的一个字符
*,+,?,{N},{M,N},{M,},{,N} -- 贪婪
*?,+?,??,{N}?,{M,N}?,{M,}?,{,N}? -- 非贪婪
正则1|正则2
()分组

2.re模块

  • 完全匹配re.fullmatch()
  • 匹配字符串开头re.match()
  • 查找re.search()
  • 搜索re.findall() .re.finditer
  • 分割:re.split()
  • 替换:re.sub()

3. 应用

# 正则匹配( names = ("排名", "影片", "演员", "上映时间", "评分"))
#创建正则
patterns = re.compile(r'class="board-index board-index-(.*?)">.*?movie-item-info">.*?title="(.*?)" data-act.*?主演:(.*?)\n.*?上映时间:(.*?)</p>.*?integer">(.*?)</i><i class="fraction">(.*?)</i>', re.S)

#匹配
result = patterns.findall(req.text)
        
  • re.S 表示支持换行
  • (.*?) 表示 需要返回的内容
  • ? 表示非贪婪模式

二. BeautifulSoup

  • pip install beautifulsoup4
  • from bs4 import BeautifulSoup

1. 标签选择器

from bs4 import BeautifulSoup

html1 = """
<html><head><title>学习爬虫好开心</title></head>
<body>
<p class="title" name="dromouse"><b>( ̄TT ̄)笔芯</b></p>
<p class="story">喵了个猫
<a href="http://example.com/elsie" class="sister" id="link1">汪汪汪,汪星人</a> and
<a href="http://example.com/lacie" class="sister" id="link2">喵喵喵,喵星人</a>
最后变成一锅高汤</p>
<p class="story">...</p>
"""

# 标签解析器
# 通过soup对象.标签 获取整个标签的内容

soup = BeautifulSoup(html, 'lxml')
print(soup.title)
print(soup.title.string)

# # 多个p标签获取的只是第一个
print(soup.p)
print(soup.p.string)

# # 通过soup对象.标签[属性] 或者, soup对象.标签.attrs[属性] 获取属性的值
# 两种方法结果一样
# print(soup.p['name'])
# print(soup.p['class'])
# print(soup.p.attrs['class'])
# print(soup.p.attrs['name'])

# 获取兄弟节点
# soup对象.p标签.next_siblings
print(soup.p.next_sibling)
print(soup.p.next_siblings)
print(list(soup.p.next_siblings))

# soup对象.p标签.next_previous
print(soup.p.previous_siblings)
print(list(soup.p.previous_siblings))

# 获取子节点
print(soup.body)
print(list(soup.body.children))

# 获取第二个p标签
print(list((list(soup.p.next_siblings)[1].children)))
print(list((list(soup.p.next_siblings)[1].a)))

# # 父节点
print(soup.a.parent)
print(list(soup.a.parents))

# 子孙节点
print(list(soup.body.children))
print(list(soup.body.descendants))

# prettify 补充优化html文档和结构
print(soup.prettify())

# 去节点名字
print(soup.p.name)
print(soup.a.name)

2. 标准选择器

# 标准选择器
'''
find()
find_all()
'''
html = '''
<div class="panel">
    <div class="panel-heading">
        <h4>Hello</h4>
    </div>
    <div class="panel-body">
        <ul class="list" id="list-1">
            <li class="element">Foo<>
            <li class="element">Bar<>
            <li class="element">Jay<>
        </ul>
        <ul class="list list-small" id="list-2">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
        </ul>
    </div>
</div>
'''
# #####################
'''
find()
find_all()

'''

soup = BeautifulSoup(html, 'lxml')

# 通过标签查
print(soup.find_all('ul'))
print(soup.find_all('li'))

# 通过属性查
print('^-^ '*20)
print(soup.find_all(attrs={'id': 'list-2'}))
print(soup.find_all(attrs={'class': 'list-small'}))

print('^-^ '*20)
print(soup.find_all(id='list-2'))
print(soup.find_all(class_='list-small'))

# 通过文本获取内容
print('^-^通过文本获取内容 '*5)
print(soup.find_all(text='Foo'))

3. css解释器


# #################################################
# CSS 选择器
print(soup.select('ul li'))
print(soup.select('#list-2 li'))
print(soup.select('.list-small li'))

for item in soup.select('.list-small li'):
    print(item.string)

spider(爬虫)_数据存储

1. text

    # 组装 str1
    str1 = ''
    for item in infolist:
        tmp = '排名:{}   影片:{}  演员:{} 上映时间:{} 评分:{} \n'.format(item[0], item[1], item[2], item[3], item[4]+item[5])
        print(tmp)
        str1 += tmp
    # 写入文件
    with open('top100.txt', 'w')as file:
        file.write(str1)

2. excl

    import xlwt
    
    mybook = xlwt.Workbook()
    mySheet = mybook.add_sheet('xxxxxxxxx')
    names = ("排名", "影片", "演员", "上映时间", "评分")
    for i in range(5):
        mySheet.write(0, i, names[i])

    for index, item in enumerate(infolist):
        for i in range(5):
            data = item[i]
            if i == 4:
                data = item[i]+item[i+1]
            mySheet.write(index+1, i, data)

    mybook.save('text.xls')

3. sql

import pymysql


def get_mysql_connect():
    """
    创建数据库对象
    :return: 
    """
    conn = pymysql.Connection(host='127.0.0.1',
                    port=3307,
                    user='root',
                    password='123456',
                    database='1901spider'
                    )
    return conn


def get_cursor(conn):
    """
    获取游标
    :param conn: 
    :return: 
    """
    cursor = conn.cursor()
    return cursor


def execute_sql(cursor, data):
    """
    执行sql语句
    :param cursor: 
    :param data: 
    :return: 
    """
    for item in data:
        sql = 'insert into maoyantop100\
        (vactor, vindex, releasetime, vname, vscore, vimg)\
        values ("{}", "{}", "{}", "{}", "{}", "{}")'.format(
            item['actor'], item['index'], item['time'], item['name'], item['score'], item['logo'])
        cursor.execute(sql)


def close_conn(conn):
    """
    提交和关闭链接
    :param conn: 
    :return: 
    """
    conn.commit()
    conn.close()

spider(爬虫)_辅助工具

1. 百分号语法转换

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,454评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,553评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,921评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,648评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,770评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,950评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,090评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,817评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,275评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,592评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,724评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,409评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,052评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,815评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,043评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,503评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,627评论 2 350

推荐阅读更多精彩内容

  • 声明:本文讲解的实战内容,均仅用于学习交流,请勿用于任何商业用途! 一、前言 强烈建议:请在电脑的陪同下,阅读本文...
    Bruce_Szh阅读 12,685评论 6 28
  • 1. 概述 本文主要介绍网络爬虫,采用的实现语言为Python,目的在于阐述网络爬虫的原理和实现,并且对目前常见的...
    Lemon_Home阅读 2,736评论 0 21
  • Python版本管理:pyenv和pyenv-virtualenvScrapy爬虫入门教程一 安装和基本使用Scr...
    inke阅读 35,244评论 7 93
  • title: python语法练习 参考阮一峰等多个文件用来练习python基本语法 [TOC] import文件...
    采香行处蹙连钱阅读 2,362评论 0 2
  • 上网原理 1、爬虫概念 爬虫是什麽? 蜘蛛,蛆,代码中,就是写了一段代码,代码的功能从互联网中提取数据 互联网: ...
    riverstation阅读 8,036评论 1 2