爬虫第四篇

爬虫第四篇

处理Ajax动态加载

import requests
import json
import pymysql

class DoubanSpider:
    def __init__(self):
        self.url = "https://movie.douban.com/j/chart/top_list?"
        self.headers = {"User-Agent":"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)"}
        self.db = pymysql.connect("192.168.56.129","lion","123456", "spiderdb",charset="utf8")
        self.cursor = self.db.cursor()
        
    # 获取页面
    def getPage(self,params):
        res = requests.get(self.url,params=params, headers=self.headers)
        res.encoding = "utf-8"
        html = res.text
        # html为[{1个电影信息},{},{}]
        self.parsePage(html)
    
    # 解析页面
    def parsePage(self,html):
        ins = 'insert into film values(%s,%s)'
        rList = json.loads(html)
        for rDict in rList:
            name = rDict["title"]
            score = rDict["score"]
            
            L = [name.strip(),float(score.strip())]
            self.cursor.execute(ins,L)
            self.db.commit()
    
    # 主函数
    def workOn(self):
        number = input("请输入数量:")
        # 传递这些参数,会返回json格式的字符串
        params = {
                "type":"11",
                "interval_id":"100:90",
                "action":"",	
                "start":"0",
                "limit":number 
            }
        self.getPage(params)
               
if __name__ == "__main__":
    spider = DoubanSpider()
    spider.workOn()

自动化工具
2. selenium+phantomjs/chrome强大网络爬虫组合

  1. selenium
           1. Web自动化测试工具,应用于Web自动化测试
           2. 特点
                   1. 可以运行在浏览器,根据指定命令操作浏览器,让浏览器自动加载页面(可以处理Ajax请求
                    2. 只是工具,需要与第三方浏览器结合使用
           3. 安装
                   (管理员Anaconda Prompt):
                    conda install selenium
            4. phantomjs -v

  2. 无界面浏览器(无头浏览器)
           1. 特点
                   1. 把网站加载到内存进行页面加载
                   2. 运行高效
           2. Windows安装
                   1. 把下载的exe文件,拷贝到python安装目录的Scripts目录下
                    C:\ProgramData\Anaconda3\Scripts
                   cmd
                   phantomjs -v

  3. Ubuntu安装

    1. 下载安装包并解压:phantomjs-2.1.1-.
    2. cd到解压的路径的 bin 目录下
    3. 把文件拷贝到 /usr/bin/ 目录中
      sudo cp phantomjs /usr/bin
    4. 终端 : phantomjs -v
  4. chromedriver

    1. 下载并安装
    2. https://chromedriver.storage.googleapis.com/index.html
    3. 查看Chrome浏览器版本
      设置 - 帮助 - 关于Google chrome
    4. 拷贝chromdriver.exe到Scripts目录下
    5. chromedriver -v
  5. 浏览器对象(driver)的方法

​                1.driver.save_screenshot(‘xxx.png’) 获取网页截屏

​                2.driver.get(url) : 发请求,获响应

​               3.driver.page_source : 获取html源码

​               4.driver.page_source.find(‘字符串’) 查找失败 : -1

       6.单元素查找(节点对象,只找第1个,search)

​                1.driver.find_element_by_id(’’)

​                2.driver.find_element_by_name(’’)

​                3.driver.find_element_by_class_name()

​                4.driver.find_element_by_xpath(’’)

       ​7.多元素查找(列表) 返回列表

​                1.driver.find_elements_by_id(’’)

​                2.driver.find_elements_by_name(’’)

​                3.driver.find_elements_by_class_name()

​                4.driver.find_elements_by_xpath(’’)

​                5.利用节点对象的 text 属性可获取文本内容

        8. 节点对象.send_keys(’’)
        9. 节点对象.click()

#案例

from selenium import webdriver
import time 

# 先创建浏览器对象
driver = webdriver.Chrome()
# 打开百度
driver.get('http://www.baidu.com/')
# 找到搜索框,发送文字
key = input("请输入要搜索的内容:")
# 找到搜索框节点
kw = driver.find_element_by_id('kw')
kw.send_keys(key)
# 找到 百度一下 按钮节点,点击一下
su = driver.find_element_by_id('su')
su.click()

time.sleep(1)
# 截图
driver.save_screenshot('美女.png')
# 关闭浏览器
driver.quit()
from selenium import webdriver
import time 

# 创建浏览器对象
driver = webdriver.Chrome()
# 访问京东首页
driver.get('https://www.jd.com/')
# 找到搜索框按钮,接收终端输入,发送到搜索框
text = driver.find_element_by_class_name('text')
key = input("请输入要搜索的内容:")
text.send_keys(key)
# 点击 搜索按钮
button = driver.find_element_by_class_name('button')
button.click()

while True:
    # 执行脚本,进度条拉到最底部
    driver.execute_script( 'window.scrollTo(0,document.body.scrollHeight)')
    time.sleep(3)
    # 提取数据,分析数据
    rList = driver.find_elements_by_xpath('//div[@id="J_goodsList"]//li')
    # rList : ['商品1节点对象','商品2节点对象']
    for r in rList:
        contentList = r.text.split('\n')
        price = contentList[0]
        name = contentList[1]
        commit = contentList[2]
        market = contentList[3]
        
        d = {
                "价格":price,
                "名称":name,
                "评论":commit,
                "商家":market,
                }
        with open("jd.json","a",encoding="utf-8") as f:
            f.write(str(d) + '\n')
        
    # 点击下一页,-1表示没找到
    if driver.page_source.find('pn-next disabled') == -1:
        driver.find_element_by_class_name('pn-next').click()
        time.sleep(3)
    else:
        print("爬取结束")
        break
          
#下一页能点 :  pn-next
#下一页不能点: pn-next disabled

猜你喜欢

转载自blog.csdn.net/weixin_43278089/article/details/88625259