day9

昨日作业:

'''
主页:
    图标地址、下载次数、大小、详情页地址
详情页:
    游戏名、好评率、评论数、小编点评、下载地址、简介、网友评论、1-5张截图链接地址、
https://www.wandoujia.com/wdjweb/api/category/more?catId=6001&subCatId=0&page=1&ctoken=FRsWKgWBqMBZLdxLaK4iem9B
https://www.wandoujia.com/wdjweb/api/category/more?catId=6001&subCatId=0&page=2&ctoken=FRsWKgWBqMBZLdxLaK4iem9B
https://www.wandoujia.com/wdjweb/api/category/more?catId=6001&subCatId=0&page=3&ctoken=FRsWKgWBqMBZLdxLaK4iem9B
32
'''
import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient
'''
3、把豌豆荚爬取的数据插入mongoDB中
    - 创建一个wandoujia库
        - 把主页的数据存放一个名为index集合中
        - 把详情页的数据存放一个名为detail集合中
'''
# 连接MongoDB客户端
client = MongoClient('localhost', 27017)
# 创建或选择wandoujia库,index集合
index_col = client['wandoujia']['index']
# 创建或选择wandoujia库,detail集合
detail_col = client['wandoujia']['detail']
# 1、发送请求
def get_page(url):
    response = requests.get(url)
    return response

# 2、开始解析
# 解析详情页
def parse_detail(text):
    soup = BeautifulSoup(text, 'lxml')
    # print(soup)
    # app名称
    try:
        name = soup.find(name="span", attrs={"class": "title"}).text
    except Exception:
        # 若有异常,设置为None
        name = None
    # print(name)
    # 好评率
    try:
        love = soup.find(name='span', attrs={"class": "love"}).text
    except Exception:
        love = None
    # print(love)
    # 评论数
    try:
        commit_num = soup.find(name='a', attrs={"class": "comment-open"}).text
    except Exception:
        commit_num = None
    # print(commit_num)
    # 小编点评
    try:
        commit_content = soup.find(name='div', attrs={"class": "con"}).text
    except Exception:
        commit_content = None
    # print(commit_content)
    # app下载链接
    try:
        download_url = soup.find(name='a', attrs={"class": "normal-dl-btn"}).attrs['href']
    except Exception:
        # 若有异常,设置为None
        download_url = None
    # print(download_url)
    # print(
    #     f'''
    #     ============= tank ==============
    #     app名称:{name}
    #     好评率: {love}
    #     评论数: {commit_num}
    #     小编点评: {commit_content}
    #     app下载链接: {download_url}
    #     ============= end ==============
    #     '''
    # )
    # 判断所有数据都存在,正常赋值
    if name and love and commit_num and commit_content and download_url :
        detail_data = {
            'name': name,
            'love': love,
            'commit_num': commit_num,
            'commit_content': commit_content,
            'download_url': download_url
        }
    # 若love没有值,则设置为 没人点赞,很惨
    if not love:
        detail_data = {
            'name': name,
            'love': "没人点赞,很惨",
            'commit_num': commit_num,
            'commit_content': commit_content,
            'download_url': download_url
        }
    # 若download_url没有值,则设置为 没有安装包
    if not download_url:
        detail_data = {
            'name': name,
            'love': love,
            'commit_num': commit_num,
            'commit_content': commit_content,
            'download_url': '没有安装包'
        }
 
    # 插入详情页数据
    detail_col.insert(detail_data)
    print(f'{name}app数据插入成功!')
# 解析主页
def parse_index(data):
    soup = BeautifulSoup(data, 'lxml')
    # 获取所有app的li标签
    app_list = soup.find_all(name='li', attrs={"class": "card"})
    for app in app_list:
        # print(app)
        # print('tank' * 1000)
        # print('tank *' * 1000)
        # print(app)
        # 图标地址
        # 获取第一个img标签中的data-original属性
        img = app.find(name='img').attrs['data-original']
        # print(img)
        # 下载次数
        # 获取class为install-count的span标签中的文本
        down_num = app.find(name='span', attrs={"class": "install-count"}).text
        # print(down_num)
        import re
        # 大小
        # 根据文本正则获取到文本中包含 数字 + MB(\d+代表数字)的span标签中的文本
        size = soup.find(name='span', text=re.compile("\d+MB")).text
        # print(size)
        # 详情页地址
        # 获取class为detail-check-btn的a标签中的href属性
        # detail_url = soup.find(name='a', attrs={"class": "name"}).attrs['href']
        # print(detail_url)
        # 详情页地址
        detail_url = app.find(name='a').attrs['href']
        # print(detail_url)
        # 拼接数据
        index_data = {
            'img': img,
            'down_num': down_num,
            'size': size,
            'detail_url': detail_url
        }
        # 插入数据
        index_col.insert(index_data)
        print('主页数据插入成功!')
        # 3、往app详情页发送请求
        response = get_page(detail_url)
        # 4、解析app详情页
        parse_detail(response.text)

def main():
    for line in range(1, 33):
        url = f"https://www.wandoujia.com/wdjweb/api/category/more?catId=6001&subCatId=0&page={line}&ctoken=FRsWKgWBqMBZLdxLaK4iem9B"
        # 1、往app接口发送请求
        response = get_page(url)
        # print(response.text)
        print('*' * 1000)
        # 反序列化为字典
        data = response.json()
        # 获取接口中app标签数据
        app_li = data['data']['content']
        # print(app_li)
        # 2、解析app标签数据
        parse_index(app_li)
        # 执行完所有函数关闭mongoDB客户端
        client.close()
if __name__ == '__main__':
    main()

 

 

 

 

 

今日学习内容:

一 Scrapy爬虫框架
发送请求 ---> 获取响应数据 ---> 解析数据 ---> 保存数据

** Scarpy框架介绍 **

1、引擎(EGINE)
引擎负责控制系统所有组件之间的数据流,并在某些动作发生时触发事件。有关详细信息,请参见上面的数据流部分。

2、调度器(SCHEDULER)
用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL的优先级队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址

3、下载器(DOWLOADER)
用于下载网页内容, 并将网页内容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的

4、爬虫(SPIDERS)
SPIDERS是开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求

5、项目管道(ITEM PIPLINES)
在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作
下载器中间件(Downloader Middlewares)位于Scrapy引擎和下载器之间,主要用来处理从EGINE传到DOWLOADER的请求request,已经从DOWNLOADER传到EGINE的响应response,
你可用该中间件做以下几件事:
  (1) process a request just before it is sent to the Downloader (i.e. right before Scrapy sends the request to the website);
  (2) change received response before passing it to a spider;
  (3) send a new Request instead of passing received response to a spider;
  (4) pass response to a spider without fetching a web page;
  (5) silently drop some requests.

6、爬虫中间件(Spider Middlewares)
位于EGINE和SPIDERS之间,主要工作是处理SPIDERS的输入(即responses)和输出(即requests)

** Scarpy安装 **
1、pip3 install wheel
2、pip3 install lxml
3、pip3 install pyopenssl
4、pip3 install pypiwin32
5、安装twisted框架
下载twisted
http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
安装下载好的twisted
pip3 install 下载目录\Twisted-17.9.0-cp36-cp36m-win_amd64.whl

6、pip3 install scrapy

** Scarpy使用 **
1、进入终端cmd
- scrapy
C:\Users\administortra>scrapy
Scrapy 1.6.0 - no active project

2、创建scrapy项目
1.创建一个文件夹,专门用于存放scrapy项目
- D:\Scrapy_prject
2.cmd终端输入命令
scrapy startproject Spider_Project( 项目名)
- 会在 D:\Scrapy_prject文件夹下会生成一个文件
Spider_Project : Scrapy项目文件

3.创建爬虫程序
cd Spider_Project # 切换到scrapy项目目录下
# 爬虫程序名称 目标网站域名
scrapy genspider baidu www.baidu.com # 创建爬虫程序

3、启动scrapy项目,执行爬虫程序

# 找到爬虫程序文件进行执行
scrapy runspider只能执行某个 爬虫程序.py
# 切换到爬虫程序执行文件目录下
- cd D:\Scrapy_prject\Spider_Project\Spider_Project\spiders
- scrapy runspider baidu.py

# 根据爬虫名称找到相应的爬虫程序执行
scrapy crawl 爬虫程序名称
# 切换到项目目录下
- cd D:\Scrapy_prject\Spider_Project
- scrapy crawl baidu

[console_scripts]
cftp = twisted.conch.scripts.cftp:run
ckeygen = twisted.conch.scripts.ckeygen:run
conch = twisted.conch.scripts.conch:run
mailmail = twisted.mail.scripts.mailmail:run
pyhtmlizer = twisted.scripts.htmlizer:run
tkconch = twisted.conch.scripts.tkconch:run
trial = twisted.scripts.trial:run
twist = twisted.application.twist._twist:Twist.main
twistd = twisted.scripts.twistd:run
 
 



posted @ 2019-06-21 23:35  亓呆子  阅读(125)  评论(0编辑  收藏  举报