认识爬虫

1.读取网页的方式

  • 不同方式要读取百度首页
    共同代码

    import urllib2
    import urllib
    from urllib import request
    header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}
    url = "https://www.baidu.com"
    

    python2的写法

    request = urllib2.Request(url, headers=header)
    response = urllib2.urlopen(request)
    print response.read().decode("utf-8") #返回源码
    print response.info()  # 返回网页信息
    print response.code  # 状态码 200 成功, 301,重定向,403拒接访问,404丢失
    

    python3 的写法

    request = urllib.request.Request(url, headers=header)
    response = urllib.request.urlopen(request)
    print(response.read().decode("utf-8"))
    
    response = requests.get(url, headers=header)
    print(response)
    

    get/post

    response = requests.get(url, headers=header)
    print(response.content.decode("utf-8"))
    
    # 有道翻译post
    url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
    response = requests.post(url, headers=header)
    res = response.content
    tgt = json.loads(res)  # 返回一个json数据
    print(tgt["translateResult"])
    

    handler

    import urllib.request
    
    urllib.request.urlopen() # 特殊的Handler
    
    handler = urllib.request.HTTPHandler()  # http 构建一个Handler处理器
     handler = urllib.request.HTTPSHandler() # https
    opener = urllib.request.build_opener(handler)  # 创建一个打开器
    
    '''
    参数fullurl, data=None, timeout
    '''
    response = opener.open("http://www.baidu.com")  # 打开
    print(response.read().decode("utf-8"))
    
    urllib.request.HTTPSHandler()  # 处理https
    

    2.解析网页的方式

    • 正则表达式

      findall()括号里面的参数('写好的正则表达式', '要匹配的内容')
      response = re.findall()  #返回一个列表
      例子
      jobre = "<em>(\d+)</em>"
      print(re.findall(jobre, response.text)[0])
      
    • Beautifulsoup

      Beautifulsoup()括号里面的参数可以写读取的网页和解析器(html5lib  和lxml)
      soup = Beautifulsoup(response, lxml)
      select()括号里面参数可以写要解析的内容规则
      soup.select("#position_detail > div > table")
      
    • xpath

      首先把网页转换成lxml的etree的格式
      HTML() 括号;里面的参数是要读取的网页
      myTree = lxml.etree.HTML(HTML)
      cityList = myTree.xpath("//div[@class=\"maincenter\"]/div[2]/div[2]/div/a")  # 城市列表
      
  • 三中方式爬取智联招聘上的职位数量

    import requests
    import lxml
    from lxml import etree
    from bs4 import BeautifulSoup
    import re
    
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}
    
    url = "https://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%B9%BF%E5%B7%9E&kw=python%20&sm=0&p=1"
    
    response = requests.get(url, headers=header)
    print(response)
    
    html = lxml.etree.HTML(response.text)
    jobNum = html.xpath("//span[@class=\"search_yx_tj\"]/em/text()")
    print(jobNum[0])  # 返回一个列表
    
    soup = BeautifulSoup(response.text, "lxml")
    
    # span.search_yx_tj > em
    
    print(soup.select("span.search_yx_tj > em")[0].text)
    print(soup.find("span", class_="search_yx_tj").em.get_text())
    
    """
    <em>1635</em>
    """
    jobre = "<em>(\d+)</em>"
    print(re.findall(jobre, response.text)[0])
    
    
    # //div[@class="maincenter"]/div[2]/div[2]
    

    3.一些细节

    urllib.urlencode()  #url编码
    urllib.unquote()  #url解码 
    
    py2 和 py3 的区别:
        Python2  raw_input()  / print  response
        Pythin3  input()  / print(response)
    
    代理IP:
    httpProxy = {"http":"10.3.123.45:808"}   #代理IP
    proxy = urllib.request.ProxyHandler(httpProxy)  #创建一个代理处理器
    
    opener = urllib.request.build_opener(proxy)   #创建一个打开器
    urllib.request.install_opener(opener) # 安装全局opener
    
    urllib :read()
    request: text 返回文本 / content 返回字节
    
    Beautifulsoup:
        soup.find('p') #第一个标签的所有结果
        soup.find_all('p')  #找到所有的匹配结果,返回一个列表
        soup.find_all(re.compil e("^p"))  #使用正则,re.compile()预处理
        soup.find_all(text=re.comlile("e"))  #查询有"e"的文本
        soup.select("p b")  #p标签下的所有b标签
        soup.select("p > b")   #p标签下子节点的b标签
    
    jobnum=soup.find("span",class="search_yx_tj")
    jobnum=soup.find("span",attrs={"class":"search_xy_tj"})
    提取数字:print(jobnum.em.string)
    提取文本方式:string/text/get_text()   
    
    
    %s 便于人阅读 类型:text
    %r 便于机器阅读  类型:字符串
    
    xpath:
      #  /根节点  文档结构要完整
      #  //全局 返回一个列表  文档结构可以不完整
      #  ./  当前的节点
      #  ..  当前上一级父级
      #  @  属性
      #  *  所有的符合的结果
      #  |  或者  
      #  //div/ul   层级  第二个/(子节点)
      #  //div//ul   两个//  孙子节点
      #  //ul[1]  定位(ul下的第一个节点)
      #  //ul/li/text()  ul下的li下的文本
      #  li.xpath("./a/@href='link1.html'")  判断,存在返回True
    

猜你喜欢

转载自blog.csdn.net/random39/article/details/80879202
今日推荐