0


爬虫实战selenium模板从开发到部署

问题:根据指定关键字爬取某网站的回答内容

  1. 根据指定关键字爬取回答摘要
  2. 过滤重复数据
  3. 把数据保存到mongodb
  4. 部署到服务器上
  5. 每隔一个小时爬一次

技术选型

在开始之前需要先对网站进行分析,是否需要登录,防爬做的怎么样,如果网站的防爬做的比较好,并且要爬的数据量并不大,那就选择最简单最通用的方式,也就是用selenium做。

爬的数据是不确定的,采用非关系型数据库比较好,这里使用mongodb

爬虫部署可以使用定时任务,也可以使用爬虫管理系统,这里使用爬虫管理系统部署,像下图这样子的功能。
在这里插入图片描述

代码实现

考虑到要部署到服务器上,selenium要设置成无界面的,无界面的selenium有很多坑,下面的代码可以拿去参考。

  1. # -*- coding: UTF-8 -*-from selenium import webdriver
  2. from selenium.webdriver.support.ui import WebDriverWait
  3. import os
  4. import time
  5. import csv
  6. import mongoConfig as mongo
  7. classAnswerItem:def__init__(self):
  8. self.href =''
  9. self.question =''
  10. self.excerpt =''
  11. self.create_time =None
  12. self.update_time =Nonedef__str__(self):return"AnswerItem(href="+ self.href +",question="+ self.question + \
  13. ",excerpt="+ self.excerpt +")"classSpider:def__init__(self, url):
  14. options = webdriver.ChromeOptions()
  15. options.add_argument('--headless')
  16. options.add_argument('--disable-gpu')
  17. options.add_argument('--no-sandbox')# 这个配置很重要
  18. options.add_argument(f'user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36')
  19. self.driver = webdriver.Chrome(chrome_options=options)withopen('./stealth.min.js')as f:
  20. js = f.read()
  21. self.driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{"source": js
  22. })
  23. self.url = url
  24. # 滚动页面到底层defscroll_bottom(self,driver):
  25. temp_height =0whileTrue:# 循环将滚动条下拉
  26. driver.execute_script("window.scrollBy(0,1000)")# sleep一下让滚动条反应一下
  27. time.sleep(0.05)# 获取当前滚动条距离顶部的距离
  28. check_height = driver.execute_script("return document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;")# 如果两者相等说明到底了if check_height == temp_height:
  29. time.sleep(1)break
  30. temp_height = check_height
  31. time.sleep(5)defclose(self):
  32. self.driver.quit()defparse(self,driver,url):
  33. driver.get(url)
  34. time.sleep(10)# 网站是滚动加载的# 滚动页面1次,爬取20条数据
  35. self.scroll_bottom(driver)
  36. question_list = driver.find_elements_by_xpath('//div[@class="ListShortcut"]/div/div/div')for index, question inenumerate(question_list):try:# 使页面滚动条移动到指定元素element的位置处
  37. driver.execute_script("arguments[0].scrollIntoView();", question)
  38. driver.execute_script("window.scrollBy(0,500)")
  39. time.sleep(0.1)
  40. item = AnswerItem()
  41. href = question.find_element_by_xpath('.//a').get_attribute('href')if'answer'in href:
  42. question_name = question.find_element_by_xpath('.//a/span').text
  43. excerpt = question.find_element_by_xpath('.//div[@class="RichContent-inner"]//span').text
  44. item.href = href
  45. item.question = question_name
  46. item.excerpt = excerpt
  47. print(item)if self.is_exist(item):continue# 保存到数据库
  48. self.save(item.__dict__)except Exception as err:print(err)'''每次保存数据到mongodb
  49. '''defsave(self,item):
  50. item['create_time']= time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
  51. item['update_time']= item['create_time']# 保存数据到mongodb
  52. mongo.save(item)# 判断mongodb数据库中是否存在此链接defis_exist(self,item):return mongo.is_exist_href(item.href)defrun(self):
  53. self.parse(self.driver,self.url)
  54. self.close()defmain():
  55. words =['python','java']for word in words:
  56. url ='/search?q={}&type=content&time_interval=a_day'.format(word)
  57. spider = Spider(url)
  58. spider.run()if __name__ =="__main__":
  59. main()

mongoConfig.py

  1. from pymongo import MongoClient
  2. collection ="test"defget_db():# 下面的配置记得改成自己的
  3. user ='root'
  4. password ='123456'
  5. host ='0.0.0.0/carve'
  6. port =27017
  7. uri ="mongodb://%s:%s@%s"%(user,password,host)
  8. client = MongoClient(host=uri,port=port)
  9. db = client['carve']return db
  10. defsave(obj):
  11. get_db()[collection].insert_one(obj)defis_exist_href(href):
  12. result = get_db()[collection].find({'href':href},{'href':1})for i in result:returnTruereturnFalse

部署爬虫

selenium的环境搭建

在centos7系统里安装谷歌浏览器及驱动

  1. # 配置yum源cd /etc/yum.repos.d/
  2. vim google-chrome.repo
  3. # 写入以下内容[google-chrome]name=google-chrome
  4. baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearchenabled=1gpgcheck=1gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
  5. # 更新yumsudo yum update
  6. # 安装Chrome无头浏览器
  7. yum -yinstall google-chrome-stable --nogpgcheck# 查看安装Chrome版本
  8. google-chrome --version# 安装谷歌驱动
  9. https://registry.npmmirror.com/binary.html?path=chromedriver/
  10. # 解压unzip chromedriver_linux64.zip
  11. # 放到/usr/binmv chromedriver /usr/bin

运行爬虫

不想用爬虫管理系统的可以用定时任务命令执行爬虫代码

  1. # 执行crontab命令crontab-e# 编写任务00 */1 * * ? python3 spider.py >> log.txt

在这里插入图片描述

标签: 爬虫 python chrome

本文转载自: https://blog.csdn.net/weixin_44018458/article/details/128567008
版权归原作者 CarveStone 所有, 如有侵权,请联系我们删除。

“爬虫实战selenium模板从开发到部署”的评论:

还没有评论