学习笔记之python--小爬虫

354 阅读2分钟

1、学python,从简单的爬虫开始。

使用了asyncio、tornado、pyppeteer

tornado比较轻量级(大佬这么和我说的)、pyppeteer是国外大佬根据node的puppeteer改写的适用于python的库(可以写js的)

python相关安装

  • mac版
    • 依靠homebrew brew install python3.python3语法和与之之前的不太一样,python3友好一点(反正我是这么想的。。)

    • pip3 python3
      默认安装了pip3。使用pip3去安装相关库

      记得先修改本地镜像,不然速度感人。

      在根目录

      • mkdir .pip
      • cd .pip
      • touch pip.conf
      • vim pip.conf
      • 输入
        [global]
        index-url=http://mirrors.aliyun.com/pypi/simple
        [install]
        trusted-host=mirrors.aliyun.com
        
        使用的是淘宝的python3镜像。 查看文件存在,因为是.pip,所以直接看不到,需要在目录里同时按command + shift + >,就可以看到隐藏文件夹。再按一次,可以取消查看。
    • 安装东西就可以 pip3 install xxx

2、代码

首先是入口文件 myTest.py

import asyncio
import tornado.ioloop
import tornado.web
import json 
# json这个根据个人需要就好,有时候编码导致json中文字乱码,可以用这个改变一下编码

import sys
sys.path.append(sys.path[0]+"/text")
from text.test import test
# 跨文件引用函数或者class,可以使用sys来操作一下
# 我没有__init__.py

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("哦吼,你来了啊~")
class DoSomeThing(tornado.web.RequestHandler):
    def get(self):
        json_obj={
            "code":200,
            "message":"你已成功引起python的注意",
            "data":asyncio.run(test())
        }
        # 我test函数用了异步,所以用这个asyncio去获取test函数的return值
        self.write(json_obj)

def jsonText(jsonObj):
    # json中汉字,由于编码问题,会乱码,所以用以下方法改变json的编码方式。
    return json.dumps(jsonObj,ensure_ascii=False)

url_list=[
    (r"/",MainHandler),
    (r"/something",DoSomeThing)
]

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

test文件

import asyncio
from pyppeteer import launch
import tornado.ioloop
import tornado.web

async def test():
    data = await what()
    return data

async def what():
    browser = await launch(handleSIGINT=False,handleSIGTERM=False,handleSIGHUP=False)   # headless = False,默认ture,为无头模式
    # 打开pyppeteer内置的浏览器先
    page = await browser.newPage()
    #然后打开当当的推荐页面
    await page.goto('http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-1')
    #开始爬
    result = await page.evaluate('''() => {
        const list = [...document.querySelectorAll('.bang_list > li')];
        const data = list.map(item=>{
            const obj={
                list_num:item.querySelector('.list_num').innerText,
                name:item.querySelector('.name a').innerText,
            }
            return obj
        })
        return data
    }''')
    
    #pyppeteer 可以写js!!!! 
    #记得加那几个小引号。
    
    #我只是爬了一下第一页的dom取其中的两个值,作为接口数据返回。
    #如果需要写入excel或者txt可以使用其他库来进行骚操作。
    
    obj={
        "result":result
    }
    
    return obj
    #值取到了,就让内置浏览器休息吧。
    await browser.close()
  • 然后python3 myTest.py
  • 打开postman localhost:8888/something 点击send。就可以看到返回值了。

笔记暂时就这多,未完待续。。。