day03-selenium简单语法xpath解析mongobd

1. selenium语法

"""__author__= 雍新有"""
from selenium import webdriver

# 模拟调用不同的浏览器
# webdriver.Chrome()
# webdriver.Firefox()
# webdriver.PhantomJS()
# webdriver.Safari()
# webdriver.Opera()

broswer = webdriver.Chrome()

broswer.get('http://www.taobao.com')

2. xpath语法

"""__author__= 雍新有"""
"""
    使用xpath解析源码
"""
from lxml import etree


html = '''
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div>
            <ul>
                <li class="class1"><a href="class1.html">1</a></li>
                <li class="class2"><a href="class2.html">2</a></li>
                <li class="class3"><a href="class3.htl">3</a></li>
                <li class="class4"><a href="class4.html">4</a></li>
                <li class="class5"><a href="class5.html">5</a></li>
                <li>
                    <ul>
                        <li class="class1"><a href="class6.html">6</a></li>
                        <li class="ass7"><a href="class7.html">7</a></li>
                        <li class="class8"><a href="class8.html">8</a></li>
                    </ul>
                </li>
            </ul>
        <div>
    </body>
    </html>
'''

# soup = BeautifulSoup(html, 'lxml')
tree = etree.HTML(html)

# 拿到整个html的内容,只不过是一个对象  '/'表示从根节点去获取元素
a1 = tree.xpath('/html')
print(a1)

# '//'从任何一个位置上获取元素
a2 = tree.xpath('//ul')
print(a2)

a3 = tree.xpath('/html/body/div/ul')
print(a3)

a4 = tree.xpath('/html/body/div/ul/li/ul')
print(a4)
for item in a4:

    # '.'表示当前位置,此处,表示ul的位置
    print(item.xpath('./li/a'))
    # '@'获取属性
    print(item.xpath('./li/a/@href'))
    # text()表示获取标签内的信息
    print(item.xpath('./li/a/text()'))

# //* -- 从任何一个位置去找所有类名为class1的标签
a5 = tree.xpath('//*[@class="class1"]')
print(a5)
for item in a5:
    print(item.xpath('./a/text()'), item.xpath('./a/@href'))

3. mongodb

3.1 mongodb语法

查看数据库: show dbs
创建数据库: db.createCollection('maoyan')
使用: use maoyan

MongoDB中的概念:数据库(类似mysql中的数据库)、
集合(类似mysql中的表)、
文档(不用定义表结构,直接记录数据)

注意: 集合可不用自己创建,向集合中插入数据时,集合会自动创建
db.集合名.insert() ===> db.user.insert({'name': 'whf'})
db.集合名.save()
db.集合名.find() 查询集合内的文档信息
db.集合名.find({}) 查询集合内的文档信息
show collections 查询集合

db.集合名.drop() 删除集合 -- 删除表
db.user(集合名).remove({'name': 'li4'}) (条件) -- 删除集合中的文档(删除一条记录)
db.user.update({'name': 'zhang3'}, {'$set':{'age': 20}}) -- 修改字段

3.2 mongodb数据库连接

"""__author__= 雍新有"""
"""
    使用pymongo
"""
import pymongo


# 获取客户端
client = pymongo.MongoClient(host='47.100.164.252', port=27017)

# 获取数据库
db = client['spider']


def execute_movie(data):

    db['douban'].insert(data)


if __name__ == '__main__':
    data = {'title': '一出好戏', 'rate': '9.0'}
    execute_movie(data)

4. 豆瓣电影爬取

  • json接口
  • mongdb存储
"""__author__= 雍新有"""
import json

from db_helper import execute_movie

"""
    爬取豆瓣电影,进行存储(采用mongodb) - 爬接口而不是直接爬页面数据
"""
import requests


def get_html(url):
    # request中默认user-agent为python=requests/版本
    # urllib中默认user-agent为python-urllib/版本
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36'
    }
    try:
        response = requests.get(url, headers=headers)
        # loads()将json格式数据转化成dict
        # dumps()将dict转化成json格式数据
        data = json.loads(response.text)
        return data
    except Exception as e:
        print('IP异常,请切换IP')
        # TODO:从ip代理池获取一个有效代理
        proxies = {
            'http': 'http://183.129.207.78:18118'
        }
        response = requests.get(url, headers=headers, proxies=proxies)
        # loads()将json格式数据转化成dict
        # dumps()将dict转化成json格式数据
        data = json.loads(response.text)
        return data


if __name__ == '__main__':

    # 分类地址
    tag_url = 'https://movie.douban.com/j/search_tags?type=movie&source='
    # 获取电影信息地址
    movie_url = 'https://movie.douban.com/j/search_subjects?type=movie&tag={tag}&sort=recommend&page_limit=20&page_start={start}'
    # 获取分类接口返回信息
    result = get_html(tag_url)
    for tag in result['tags']:
        for i in range(20):
            real_url = movie_url.format(tag=tag, start=i*20)
            # 获取到的是电影信息
            result_movie = get_html(real_url)
            print(result_movie['subjects'])
            data = result_movie['subjects']
            if len(data):
                # 接口返回电影信息存在,则保持
                for item in data:
                    # item为每一个电影的信息,使用mongdb存储
                    # 使用pymongo进行存储数据
                    execute_movie(data)
            else:
                # 接口返回电影信息不存在,则跳出当前循环
                break


5. 爬取u17最热

  • 用的本地mongdb
  • post请求
"""__author__= 雍新有"""
import pymongo
import requests
import json

client = pymongo.MongoClient(host='127.0.0.1', port=27017)
db = client['spider']


def get_html(url, data):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36',
    }
    response = requests.post(url, headers=headers, data=data)
    result = json.loads(response.text)

    return result


def save_mongo(data):
    for item in data:
        db['u17'].insert_one(item)


def main():
    post_url = 'http://www.u17.com/comic/ajax.php?mod=comic_list&act=comic_list_new_fun&a=get_comic_list'
    comic_url = 'http://www.u17.com/comic/{comic_id}.html'
    for i in range(1, 6):
        data = {
            'data[group_id]': 'no',
            'data[theme_id]': 'no',
            'data[is_vip]': 'no',
            'data[accredit]': '2',
            'data[color]': 'no',
            'data[comic_type]': 'no',
            'data[series_status]': 'no',
            'data[order]': '1',
            'data[page_num]': str(i),
            'data[read_mode]': 'no',
        }
        json = get_html(post_url, data)
        real_result = []
        for item in json['comic_list']:
            data = {
                'real_url': comic_url.format(comic_id=item['comic_id']),
                'name': item['name'],
                'img': item['cover'],
                'type': item['line1'],
            }
            real_result.append(data)
        print(real_result)
        save_mongo(real_result)


if __name__ == '__main__':
    main()
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • NoSql数据库优缺点 在优势方面主要体现在下面几点: 简单的扩展 快速的读写 低廉的成本 灵活的数据模型 在不足...
    dreamer_lk阅读 7,767评论 0 6
  • 一、MongoDB简介 1.概述 ​ MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在为WE...
    郑元吉阅读 4,635评论 0 2
  • 一、MongoDB简介 概述MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在为WEB应用提供...
    王梓懿_1fbc阅读 3,443评论 0 3
  • 一、MongoDB简介 概述MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在为WEB应用提供...
    fly5阅读 2,415评论 0 0
  • 一、MongoDB简介 概述MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在为WEB应用提供...
    未央_m阅读 3,987评论 0 1

友情链接更多精彩内容