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))