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

前言

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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值