> 백엔드 개발 > 파이썬 튜토리얼 > Selenium+Python이 Jianshu 웹사이트를 크롤링하는 방법

Selenium+Python이 Jianshu 웹사이트를 크롤링하는 방법

零到壹度
풀어 주다: 2018-04-16 09:52:56
원래의
4214명이 탐색했습니다.

이 글은 Selenium+Python이 Jianshu 웹사이트를 크롤링하는 방법을 소개합니다. 이제 모든 사람과 공유합니다. 도움이 필요한 친구들은 이를 참조할 수 있습니다.


페이지 로딩 로직

When 인터넷에서 크롤러의 기본 지식을 열정적으로 배우는 것은 연습할 대상을 찾는 것과 같습니다. 많은 기사가 포함된 짧은 책에는 귀중한 정보가 많이 포함되어 있으므로 나중에 시도해 보면 자연스럽게 선택 대상이 될 것입니다. js 관련 데이터 전송이 많이 포함되어 있기 때문에 생각만큼 간단하지 않다는 것을 알게 될 것입니다. 먼저 기존 크롤러를 사용하여 설명하겠습니다. >

Jianshu 홈페이지를 열어보세요. 특별한 것은 없는 것 같습니다

jianshu 홈페이지

Open Chrome의 개발자 모드에서 기사 제목과 href가 모두 태그는 별거 없는 것 같습니다

chrome的开发者模式,发现文章的标题,href都在a标签里,似乎也没有什么不一样的

a.png

接下来就是寻找页面上所有的a标签,但是且慢如果你仔细观察就会发现滑轮滚到一半的时候页面就会加载更多,这样的步骤会重复三次知道底部出现阅读更多

🎜🎜a.png🎜🎜🎜다음 단계는 하지만 잠시만 기다려 주시면 도르래가 반쯤 굴러가면 페이지가 더 많이 로드되는 것을 알 수 있습니다. 이 단계는 하단이 나타날 때까지 세 번 반복됩니다. 자세히 보기 버튼 🎜

Pulley

그뿐만 아니라, 하단의 href 내용도 페이지의 나머지 부분을 로드하라고 지시하지 않습니다. 유일한 방법은 자세히 보기 버튼을 계속 클릭하는 것입니다href并没有告诉我们加载剩下的页面信息,唯一的办法是不断点击阅读更多这个按钮

load_more.png

什么,将滑轮重复三次滑倒页面的中央并且不断点击按钮这种操作http请求可做不到,这更像是js操作?没错,简书的文章并不是常规的http请求,我们不能根据不同url不断重定向,而是页面的一些动作来加载页面信息。

selenium介绍

selenium是一个web自动化测试工具,支持很多种语言,我们在这里可以使用python的selenium做爬虫使用,爬取简书的过程中,它的工作原理是不断注入js代码,让页面源源不断的加载,最后再提取所有的a

load_more.png

뭐야, 도르래를 반복하세요 페이지를 세 번 아래로 밀어서 중앙으로 계속 버튼을 클릭하면 이 작업이http요청을 수행할 수 없습니다. 이것이 js 작업과 더 비슷합니까? 맞습니다. Jianshu의 기사는 일반적인 http 요청이 아니며 다양한 URL에 따라 지속적으로 리디렉션할 수는 없지만 페이지 정보를 로드하기 위한 페이지의 일부 작업이 있습니다.

🎜🎜

🎜셀레늄 소개🎜

🎜selenium은 다양한 기능을 지원하는 웹 자동화 테스트 도구입니다. 간단한 책을 크롤링하는 과정에서 Python의 셀레늄을 크롤러로 사용할 수 있습니다. 작동 원리는 js 코드를 지속적으로 삽입하고 페이지를 계속 로드한 다음 마지막으로 모든 태그. 먼저 Python에서 Selenium 패키지를 다운로드해야 합니다.🎜
>>> pip3 install selenium
로그인 후 복사
🎜🎜chromedriver🎜🎜🎜Selenium은 브라우저와 함께 사용해야 합니다. 여기서는 Chrome의 오픈 소스 베타 버전인 chromedriver를 사용하여 표시하지 않고 웹 페이지에 액세스할 수 있습니다. 앞문단이 가장 큰 특징이다. 🎜

python中操作

在写代码之前一定要把chromedriver同一文件夹内,因为我们需要引用PATH,这样方便点。首先我们的第一个任务是刷出加载更多的按钮,需要做3次将滑轮重复三次滑倒页面的中央,这里方便起见我滑到了底部

from selenium import webdriverimport time
browser = webdriver.Chrome("./chromedriver")
browser.get("https://www.jianshu.com/")for i in range(3):
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") // execute_script是插入js代码的
    time.sleep(2) //加载需要时间,2秒比较合理
로그인 후 복사

看看效果

刷出了按钮

接下来就是不断点击按钮加载页面,继续加入刚才的py文件之中

for j in range(10):  //这里我模拟10次点击    
    try: 
        button = browser.execute_script("var a = document.getElementsByClassName('load-more'); a[0].click();")
        time.sleep(2)    except:        pass'''
 上面的js代码说明一下
 var a = document.getElementsByClassName('load-more');选择load-more这个元素
 a[0].click(); 因为a是一个集合,索引0然后执行click()函数
'''
로그인 후 복사

这个我就不贴图了,成功之后就是不断地加载页面 ,知道循环完了为止,接下来的工作就简单很多了,就是寻找a标签,get其中的texthref属性,这里我直接把它们写在了txt文件之中.

titles = browser.find_elements_by_class_name("title")with open("article_jianshu.txt", "w", encoding="utf-8") as f:    for t in titles:        try:
            f.write(t.text + " " + t.get_attribute("href"))
            f.write("\n")        except TypeError:            pass
로그인 후 복사

最终结果

简书文章

headless模式

不断加载页面肯定也很烦人,所以我们测试成功之后并不想把浏览器显示出来,这需要加上headless模式

options = webdriver.ChromeOptions()
options.add_argument('headless')
browser = webdriver.Chrome("./chromedriver", chrome_options=options) //把上面的browser加入chrome_options参数
로그인 후 복사

总结

当我们没办法使用正常的http请求爬取时,可以使用selenium操纵浏览器来抓取我们想要的内容,这样有利有弊,比如

  • 优点

  1. 可以暴力爬虫

  2. 简书并不需要cookie才能查看文章,不需要费劲心思找代理,或者说我们可以无限抓取并且不会被ban

  3. 首页应该为ajax传输,不需要额外的http请求

缺点

  1. 爬取速度太满,想象我们的程序,点击一次需要等待2秒那么点击600次需要1200秒, 20分钟...

附加

这是所有完整的代码

from selenium import webdriverimport time

options = webdriver.ChromeOptions()
options.add_argument('headless')
browser = webdriver.Chrome("./chromedriver", chrome_options=options)

browser.get("https://www.jianshu.com/")for i in range(3):
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)# print(browser)for j in range(10):    try:
        button = browser.execute_script("var a = document.getElementsByClassName('load-more'); a[0].click();")
        time.sleep(2)    except:        pass#titles = browser.find_elements_by_class_name("title")with open("article_jianshu.txt", "w", encoding="utf-8") as f:    for t in titles:        try:
            f.write(t.text + " " + t.get_attribute("href"))
            f.write("\n")        except TypeError:            pass
로그인 후 복사


相关推荐:

[python爬虫] Selenium爬取新浪微博内容及用户信息

[Python爬虫]利用Selenium等待Ajax加载及模拟自动翻页,爬取东方财富网公司公告

Python爬虫:Selenium+ BeautifulSoup 爬取JS渲染的动态内容(雪球网新闻)

위 내용은 Selenium+Python이 Jianshu 웹사이트를 크롤링하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿