爬虫第三篇

爬虫第三篇

requests模块

get请求

import requests

# 1.发get请求
res = requests.get(url,params,headers,proxies,auth,verify,timeout)
# 2.响应 编码格式
res.encoding = "utf-8"
# 3. 获取html
html = res.text

requests.get(url,params,headers,proxies,auth,verify)
参数:params : 查询参数,自动拼接在URL后
     headers : 请求头文件,一般需要设置User-Agent
     proxies : 代理
     auth : Web 客户端验证
     verify : SSL证书认证

proxies:
    1.获取IP地址的网站:快代理和全网代理
    2.普通代理
        格式:proxies={"协议":"协议://IP:端口号"}
        e.g. proxies={"http":"http://37.192.32.213:36344"}
    3.私密代理
        格式:proxies={"http":"http://用户名:密码@IP地址:端口号"}

auth :auth = ("用户名","密码")    

verify:
    1.verify = True(默认):进行CA证书认证
    2.verify = False :不进行认证


# 响应对象res属性
res.encoding : 相应编码
res.text : 以字符串形式获取响应内容
res.content :bytes的形式获取响应内容   
res.status_code : HTTP 响应对象
res.url : 返回实际数据的URL地址 
    
#非结构化数据保存(图片,视频)
html = res.content
with open("***.jpg","wb") as f:
     f.write(html)

post请求

1. requests.post(url,data=data,headers,proxies,auth,verify,timeout)
2. data:字典,Form表单数据,不用编码,不用转码

Xpath解析工具

  1. 在XML文档中查找信息的语言,同样适用于HTML文档的检索
    
  2. xpath辅助工具
    1. Chrome插件 :XPath Helper
      打开/关闭 :Ctrl + shift + x
    2. Firefox插件:XPath Checker
    3. XPath编辑工具:XML quire
    
  3. 匹配演示
    1. 查找所有的book节点 : //book
    2. 查找所有book节点下的title子节点中,lang属性为"en"的节点
      //book/title[@lang="en"]
    3. 查找bookstore下的第2个book节点下的title子节点
      /bookstore/book[2]/title
        
  4. 选取节点
    // : 从整个文档中查找节点
       //price  //book//price
    @  : 选取某个节点的属性值
       //title[@lang="en"]
    
  5. @的使用
    1. 选取一类节点 : //title[@lang="en"]
    2. 选取存在某个属性节点://title[@lang]
    3. 选取节点的属性值: //title/@lang
        
  6. 匹配多路径 :|
    1. xpath表达式1  |  xpath表达式2
    2. 获取所有book节点下的title子节点和price子节点
      //book/title | //book/price
        
    7. 函数
    1. contains() :匹配一个属性值中包含某些字符串的节点
      //title[contains(@lang,"e")]
      //div[contains(@class,"njjzw")]
        <div class="njjzw10389403">
        <div class="njjzw12302932">
        <div class="njjzw23092838">
    2. text() : 获取文本
      //title[contains(@lang,"e")]/text()

lxml库及xpath使用

1. 安装
管理员Prompt : conda install lxml

2. 使用流程
    1. 导模块
    from lxml import etree
    2. 创建解析对象
    parseHtml = etree.HTML(html)
    
3. 调用xpath
    rList=parseHtml.xpath('xpath表达式')
    
** 只要调用了xpath,结果一定是列表 
import requests
from lxml import etree

class BaiduImgSpider:
    def __init__(self):
        self.baseurl = "http://tieba.baidu.com"
        self.headers = {"User-Agent":"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)"}
        self.mainurl = "http://tieba.baidu.com/f?"
        
    # 获取所有帖子的URL列表
    def getPageUrl(self,params):
        res = requests.get(self.mainurl,params=params,headers=self.headers)
        res.encoding = "utf-8"
        html = res.text
        # 提取页面中href
        parseHtml = etree.HTML(html)
        tList = parseHtml.xpath('//div[@class="t_con cleafix"]/div/div/div/a/@href')
        # tList : ['/p/232324','']        
        for t in tList:
            tLink = self.baseurl + t
            self.getImgUrl(tLink)
    
    # 获取1个帖子中所有图片的URL列表
    def getImgUrl(self,tLink):
        # 获取1个帖子的响应内容
        res = requests.get(tLink,headers=self.headers)
        res.encoding = "utf-8"
        html = res.text
        # 从帖子的html中提取图片的src
        parseHtml = etree.HTML(html)
        imgList = parseHtml.xpath('//div[@class="d_post_content j_d_post_content  clearfix"]/img[@class="BDE_Image"]/@src | //div[@class="video_src_wrapper"]/embed/@data-video')
        # 依次遍历图片连接调用写入函数
        for img in imgList:
            self.writeImage(img)
    
    # 把图片保存到本地
    def writeImage(self,img):
        # 对图片链接发请求,获取res.content
        res = requests.get(img,headers = self.headers)
        res.encoding = "utf-8"
        html = res.content
        # 写入本地文件
        filename = img[-12:]        
        with open(filename,"wb") as f:
            f.write(html)
            print("%s下载成功" % filename)
    # 主函数
    def workOn(self):
        name = input("贴吧名:")
        begin = int(input("起始页:"))
        end = int(input("终止页:"))
        for n in range(begin,end+1):
            pn = (n-1) * 50
            params = {
                    "kw" : name,
                    "pn" : pn
                }
            
            self.getPageUrl(params)
        
if __name__ == "__main__":
    spider = BaiduImgSpider()
    spider.workOn()
import requests
from lxml import etree
import pymongo

class QiushiSpider:
    def __init__(self):
        self.url = "https://www.qiushibaike.com/text/"
        self.headers = {"User-Agent":"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)"}
        # 连接对象
        self.conn = pymongo.MongoClient("192.168.56.129",27017)
        # 库对象
        self.db = self.conn["Qiushidb"]
        # 集合对象
        self.myset = self.db["zhuanye"]
    
    # 获取页面
    def getPage(self):
        res = requests.get(self.url,headers=self.headers)
        res.encoding = "utf-8"
        html = res.text
        self.parsePage(html)
    
    # 解析并写入数据库
    def parsePage(self,html):
        # 两步走
        parseHtml = etree.HTML(html)
        # 基准Xpath,每个段子对象
        # ['<element...>','<element...>','']
        baseList = parseHtml.xpath('//div[contains(@id,"qiushi_tag_")]')
        # for循环遍历每个段子对象,1个1个提取
        for base in baseList:
            # base : <element at ....>
            # 用户昵称
            username = base.xpath('./div/a/h2')
            if username:
                username = username[0].text.strip()
            else:
                username = "匿名用户"
            # 段子内容
            content = base.xpath('./a/div[@class="content"]/span/text()')
            content = "".join(content).strip()
            
            # 好笑数量
            laughNum = base.xpath('.//i[@class="number"]')[0].text        
            # 评论数量
            pingNum = base.xpath('.//i[@class="number"]')[1].text
        
            # 定义字典存mongo
            d = {
                "username":username,
                "content" :content.strip(),
                "laughNum":laughNum,
                "pingNum" :pingNum,
                }
            self.myset.insert_one(d)
        
    # 主函数
    def workOn(self):
        print("正在爬取中......")
        self.getPage()
        print("爬取结束,存入Qiushidb库")

if __name__ == "__main__":
    spider = QiushiSpider()
    spider.workOn()

猜你喜欢

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