python学习笔记-爬虫基础知识

一、爬虫介绍

1、场景分类

  定向   指爬取指定网站
  非定向  指从所有网站爬取 

2、下载页面

  常用的开源框架,requests&beautisoup

#1.requests
			response=requests.get('http://')
			response.text
#2.beautisoup模块
			soup=BeautiSoup(response.text,parser="html.parser")
			target=soup.find(id='')
			print(target)

3、示例,获取汽车新闻

import requests
from bs4 import BeautifulSoup

response=requests.get(url='http://www.autohome.com.cn/news/')
response.encoding=response.apparent_encoding

soup=BeautifulSoup(response.text,features='html.parser')

target=soup.find(id='auto-channel-lazyload-article')
li_list=target.find_all('li')
for i in li_list:
    a=i.find('a')
    if a:
        print(a.attrs.get('href'))
        txt=a.find('h3')
        print(txt)
View Code

二、requsts和beautifulsoup

示例:爬取并下载图片

import requests
from bs4 import BeautifulSoup

response=requests.get(url='http://www.autohome.com.cn/news/')
response.encoding=response.apparent_encoding   #使用自动获取的编码

soup=BeautifulSoup(response.text,features='html.parser')  #自带的html.parser.

target=soup.find(id='auto-channel-lazyload-article')
li_list=target.find_all('li')
for i in li_list:
    a=i.find('a')
    if a:
        print(a.attrs.get('href'))
        txt=a.find('h3').text
        print(txt)
        img_url=a.find('img').attrs.get('src')
        print(img_url)

        img_response=requests.get(url=img_url)
        import uuid
        file_name=str(uuid.uuid4())+'.jpg'
        with open(file_name,'wb') as f:
            f.write(img_response.content)
View Code

1、requests基本用法

  response=requests.get('url')
  response.text
  response.content
  response.encoding
  response.apparent_encoding
  response.status_code

2、beautifulsoup基本用法

  soup=beautifulsoup('<html>...</html>',features='html.parser')   得到的是一个特殊对象
  v1=soup.find('div')      得到的是一个对象
  v1=soup.find(id='il')       通过id找指定元素
  v1=soup.find('div',id='il')

  v2=soup.find_all('div')      返回的是一个列表
  v2=soup.find_all(id='il')
  v2=soup.find_all('div',id='il')

  obj=v1
  obj.text     标签对象的文本
  obj.attrs    标签对象的属性

3、示例:略

  登录获取cookie的方法

  response=requests.post(url,data=post_dict)
  print(response.text)
  cookie_dict=response.cookies.get_dict()
  print(cookie_dict)

三、模块的详细介绍

1、request详细用法

  支持的方法

  requests.get
  requests.post
  requests.put
  requests.delete
  requests.request(
    'get'
    )

  可传参数

  requests.request可传以下参数
  method:
  url:
  params:   在url传递的数据
  data:      在请求体中传递的数据,可以传字典,字符串,文件对象:如
         data={'k1':'v1','k2':'v2'}
         data='user=steven&pwd=123'
  json:    参数是字典里面嵌套字典,不能在data里传递,只能用json

          #json参数在请求体里格式  "{'user':'steven','pwd':'123'}"

  headers:   请求头
  Referer:  记录的上一次访问的网站
  User-Agent:浏览器标识

  cookies

  file:

  requests.post(
    url='xxx',
    files={
    'f1':open('s1.py','rb'), #发送文件
    'f2':('aaa.py',open('s1.py','rb')) #发送文件,定制文件名
    })

  auth:            基本认证,(在headers中加入加密的用户名和密码),一般用得少这种简单加密的
  timeout:           请求和响应的超时时间
  allow_redirects:   是否允许重定向
  proxies:           代理

  proxys={
    'http':'http://4.19.128.5:8099'
    }

  stream:                    流
  cert:            证书文件
  verify:         是否忽略证书,False忽略证书

   其他方法

  session=requests.session()     #这里的session,用于保存客户端历史访问信息

  理解:相当于把一次请求的获取的cookie放在全集变量,再访问又放到全局变量,可以自动帮助管理cookie,发请求不用带cookie了

2、BeautifulSoup详细用法

  找到标签

  soup=BeautifulSoup(html_doc,features='lxml')

  tag=soup.find('a')

  标签对象方法

  name            标签名

  attr          标签的属性(格式是字典)

    attrs=tag.attrs           #获取属性,是字典
    tag.attrs={'ik':123} #可以修改获取到的属性
    attrs['k2']=235
    del attrs['k2']

   children

    tags=soup.find('body').children   #子标签,可迭代对象里有换行等字符串。
                        #只找标签时,判断type是不是bs4.element.Tag对象

  descendants         #找所有后代标签

  clear           #将标签的所有子标签删除(保留标签名)

  decompose        #递归删除所有子标签(不保留标签名)

  extract           #递归删除所有的标签,并获取删除的标签

  decode         #转换为字符串(含当前标签),decode_contents(不含当前标签)

  encode         #转换为字节(含当前标签),encode_contents(不含当前标签)

  find           #获取匹配到的第一个标签

    tag=soup.find(name='a',attrs={'class':True},recursive=True,text='lacie')  #通过多个条件查找,recursive表示递归
    tag=soup.find(name='a',class_='sister',recursive=True,text='lacie') #class是关键字,加_

  find_all

    v=soup.find_all(href=['link1','link2'])    #列表多个条件时,是或的关系
    #find_all 支持正则
    rep=re.compile('sister.*')
    v=soup.find_all(class_=rep)
    print(v)

  has_attr          #检查是否具有该属性,tag.has_attr("id")

  get_text           #获取标签内部文本内容,tag.get_text()

  get           #获取标签的某个属性,tag.get('id')

  index            #检查标签在某标签的索引位置

  is_empty_element      #是否是空标签或者自闭合标签,br,hr,input,img,meta,space,link,frame,base

  关联标签

  (next,next_element,next_elements,next_sibling,next_siblings,previous)

  查找关联标签(find_next,...)

  select           按css,js选择器的方式查找

#举例
soup.select("body > a")
soup.select("#link1 +.sister")
soup.select(".sister")
soup.select("[class~=sister]")
soup.select("#link1")
soup.select("a#link2")
soup.select("a[href]")
举例

  string           标签内容,tag.string='new content'

    tag.stripped_strings #递归内部获取所有标签的文本

  append          #在当前标签内部追加一个标签

  insert           #指定位置插入一个标签

  insert_after,insert_before

  replace_with        #在当前标签替换为指定标签

  wrap             #将标签包裹起来

  unwrap


posted @ 2024-06-21 08:59  子不语332  阅读(14)  评论(0编辑  收藏  举报