欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python用最精简,最简单的方法爬百度,万行数据不是问题

程序员文章站 2022-05-30 16:29:15
...

前言

       目前网络上很多关于爬取百度的方法,其实都不好用。特别是那些爬取多页内容的数据。而这次提供的代码是直接通过模拟浏览器的动作直接爬取数据,爬取的精度和质量都非常高。
       暂时没有时间写内容,直接送上代码!!enjoy that!

       后面有关于表格及写入mysql的库,在后面有空的时候会补充整个写入MYSQL的程序及针对某些网站的表格数据进行爬取的代码补充。


import asyncio
from pyppeteer import launch
import random
from lxml.html import etree
import pandas as pd

class Get_Data:
    viewport = {"width":1280, "height":1024}
    userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299"

    async def _init_browser(self):
        brower = await launch(options={"timeout":5*10000})
        await brower.createIncognitoBrowserContext()
        page = await brower.newPage()
        await page.setViewport(self.viewport)
        await page.setUserAgent(self.userAgent)
        # 隐藏webdriver标签特性
        await page.evaluateOnNewDocument("()=>{Object.defineProperties(navigator,{ webdriver:{ get: () => false } })}")

        return page
    # keyword 要搜索的关键词
    # page_count 要爬多少页
    async def search(self,keyword, page_count):
        page = await self._init_browser()
        await page.goto("https://www.baidu.com/", options={"timeout":50*1000})
        await page.type("input#kw", keyword)
        # 输入调整
        await asyncio.wait([
            page.click("input#su"),
            page.waitForNavigation()
        ])
        # 意思一下,,页面滚动到底部
        await page.evaluate("window.scrollBy(0, document.body.scrollHeight)")
        await self._get_page_content(page,page_count) # 开工打印数据


    # 执行数据爬取
    async def _get_page_content(self, page, page_count):
        i = 0
        while i< page_count:
            await asyncio.sleep(random.randint(1,3))  # 滑动到底部后,等待加载完成
            # await page.waitForXPath("//div[@id='page']/div[@class='page-inner']") # 等待页面跳转栏的出现
            elements = await page.xpath("//h3[@class='t']/a")
            # 打印当前页面数据
            await self._prt(elements)
            await self._navigate_next_page(page)
            i+=1

     # 导航到下一页
    async def _navigate_next_page(self, page):
        x_e = await page.xpath("//div[@class='page-inner']")
        x_e = await x_e[0].JJ("a")
        # 获取下一页标签的位置
        nxt_page = len(x_e)
        await asyncio.wait([
            # 点击下一页的button,并等到导航
            x_e[nxt_page-1].click(options={"delay":random.randint(1,5)}),
            page.waitForNavigation()
        ])
        await asyncio.sleep(random.randint(1,3))  # 滑动到底部后,意思一下
        await page.evaluate("window.scrollBy(0, document.body.scrollHeight)")

    # 打印爬取的内容
    # 这里只打印标题
    async def _prt(self, elements):
        for ele in elements:
            title = await (await ele.getProperty("textContent")).jsonValue()
            print(title)


asyncio.get_event_loop().run_until_complete(Get_Data().search("衣柜", 6))