精华内容
下载资源
问答
  • 但是在获取网页的时候,有的人写urlopen()方法,有的人写request.get方法,在查找有用信息的时候,有人用BeautifulSoup,有的人用xpath有的人甚至正则。 然后还把他们组合起来,一共好几种写法,看的头昏脑涨,...

    在学习爬虫的时候,网上一大堆爬虫案例。告诉你这么写,告诉你那么写,看的眼花缭乱。
    所谓爬虫,我总结出来,就两步,第一获取网页,第二查找有用信息。
    但是在获取网页的时候,有的人写urlopen()方法,有的人写request.get方法,在查找有用信息的时候,有人用BeautifulSoup,有的人用xpath有的人甚至正则。
    然后还把他们组合起来,一共好几种写法,看的头昏脑涨,一点规律也找不到,然后你的老师还说,找个例子模仿着写,啥也不是,让他滚开,好吧。
    扯远了。。。撤回来
    首先,一个简单的爬虫怎么写?
    用urllib.request来写就是:

    import urllib.request
    import re
    import os
    web = urllib.request.urlopen("xxxx");#获取页面
    cont = web.read() #获取页面完之后,一定要读,要不然获取的是一个response对象
    pageHtml = web.decode('utf-8') #按照utf-8对象
    print(pageHtml)
    web.close #获取页面的方法也是流,要关的
    

    这就获取到网页了
    但是还有一种方式,我还可以这么写:

    import requests
    req2 = requests.get('xxxx')
    print(req1.content.decode("gbk"))
    

    其实requests是一个更高级的urllib的类,两者的作用都一样,但是就是写法不一样,让初学者很头疼,所里这里总结出来 ,推荐些requset.get,因为他简单高效。但是requsets并不是拿过来就能用,需要在cmd命令行里输入pip install

    接下来是大头了。正则表达式,xpath以及BeatuifulSoup之间,三者的区别

    import re 
    pattern = u'<a\s*href="([\u0000-\uffff&&^"]*?)"'
    #pattern = u'<a[\u0000-\uffff&&^[href]]*href="([\u0000-\uffff&&^"]*?)"'
    res = re.finditer(pattern,pageHtml)#pattern是正则表达式,pageHtml在上面已经有了,这个代表的是上面已经给过得解码过的那个页码
    

    这个就简单了,直接用re包,调用的是finditer方法,而且不止是finditer,还可以说findall。但是,又来了,又要区分差别,findall取出的是一个list,直接可以用如下代码:

    res = re.findall(regular expression,pageHtml)
    print(res)
    for r in res:
        print(r)
    

    findall是一个list,可以随时输出res这个列表,也可以随时输出里面的每一个元素。那我们接下来继续看看finditer吧

    res = re.findall(regular expression,pageHtml)
    for r in res :
       print r.group(1)
    

    finditer返回的是一个MatchObject的iterator,需要迭代并通过MatchObject的方法输出。

    接下来轮到xpath和etree的配合使用。因为xpath需要配合etree来使用吗,所以这是一个整体。

    url = requests.get("http://www.biqukan.cc/book/20461/12592815_2.html").content.decode("gbk")
    # 在这里面 etree.parre和etree.HTML都是对网页进行解析,HTML方法可以解析html网页,而parse可以解析文档之类
    selector = etree.HTML(url)
    selector1 = etree.parse()
    # 这句话是xpath中最重要的一句话,通过标签来查找到自己想要的东西
    lis = selector.xpath('xxx')
    for i in range(len(lis)):
        print(lis[i].text)
    

    但是在xpath中的东西怎么写:看过来

    这是一个常见的HTML结构,那么我要是想要知道这个李华啥爱好呢?
    看蓝色的,就一层一层的往下剥,从学生名单到爱好,最后自然就找出来了。但是如果节点太多了,我嫌写着一个一个麻烦死了怎么办?
    那我就//籍贯。//这个意思就是我可以在任何位置匹配到后面任何一个想要的东西,注意是不考虑他们的位置。

    最后最后最后:BeautifulSoup

    from bs4 import BeautifulSoup
    import urllib.request
    
    html = urllib.request.urlopen('xxx')
    html = html.read().decode("utf-8")
    soup = BeautifulSoup(html)
    image_list = soup.select('life_style1')
    print soup.prettify()#打印soup对象的内容,格式化输出
    

    在这其中有四大对象种类:
    Tag
    NavigableString
    BeautifulSoup
    Comment

    那么在最后,xpath以及BeautifulSoup还有正则表达式。更适合什么场景,什么时候使用,首先bs4(beautifulsoup),是个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
    xpath只能通过标签来获取内容。
    而正则,可以获取你任何想要的内容。
    但是一般的爬虫xpath就能够实现想要的功能了。

    展开全文
  • urllib.request619免费资源网我们都知道,urlopen()方法能发起最基本对的请求发起,但仅仅这些在我们的实际应用中一般都是不够的,可能我们需要加入headers之类的参数,那需要用功能更为强大的Request类来构建了619...

    urllib.request619免费资源网

    我们都知道,urlopen()方法能发起最基本对的请求发起,但仅仅这些在我们的实际应用中一般都是不够的,可能我们需要加入headers之类的参数,那需要用功能更为强大的Request类来构建了619免费资源网

    在不需要任何其他参数配置的时候,可直接通过urlopen()方法来发起一个简单的web请求619免费资源网

    发起一个简单的请求619免费资源网

    import urllib.request

    url='https://www.douban.com'

    webPage=urllib.request.urlopen(url)

    print(webPage)

    data=webPage.read()

    print(data)

    print(data.decode('utf-8'))

    urlopen()方法返回的是一个http.client.HTTPResponse对象,需要通过read()方法做进一步的处理。一般使用read()后,我们需要用decode()进行解码,通常为utf-8,经过这些步骤后,最终才获取到我们想要的网页。619免费资源网

    添加Headers信息619免费资源网

    import urllib.request

    url='https://www.douban.com'

    headers = {

    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',

    }

    response=urllib.request.Request(url=url,headers=headers)

    webPage=urllib.request.urlopen(response)

    print(webPage.read().decode('utf-8'))

    使用Request类返回的又是一个urllib.request.Request对象了。619免费资源网

    通常我们爬取网页,在构造http请求的时候,都需要加上一些额外信息,什么Useragent,cookie等之类的信息,或者添加代理服务器。往往这些都是一些必要的反爬机制619免费资源网

    requests619免费资源网

    通常而言,在我们使用python爬虫时,更建议用requests库,因为requests比urllib更为便捷,requests可以直接构造get,post请求并发起,而urllib.request只能先构造get,post请求,再发起。619免费资源网

    import requests

    url='https://www.douban.com'

    headers = {

    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',

    }

    get_response = requests.get(url,headers=headers,params=None)

    post_response=requests.post(url,headers=headers,data=None,json=None)

    print(post_response)

    print(get_response.text)

    print(get_response.content)

    print(get_response.json)

    get_response.text得到的是str数据类型。619免费资源网

    get_response.content得到的是Bytes类型,需要进行解码。作用和get_response.text类似。619免费资源网

    get_response.json得到的是json数据。619免费资源网

    总而言之,requests是对urllib的进一步封装,因此在使用上显得更加的便捷,建议小伙伴们在实际应用当中尽量使用requests。619免费资源网

    补充知识:python中urllib.request.Request()与urllib.request.urlopen()区别619免费资源网

    蟒蛇中urllib.request.Request()与urllib.request.urlopen()的区别:619免费资源网

    相对于urllib.request.urlopen()来说urllib.request.Request是进一步的包装请求,下面是请求类的源码示例:619免费资源网

    class Request:

    # 主要看这块,构造函数中指明了Request进一步包装请求中可以传递的参数有(url,data,headers,

    # origin_req_host,unverifiable,method)

    def __init__(self, url, data=None, headers={},

    origin_req_host=None, unverifiable=False,

    method=None):

    self.full_url = url

    self.headers = {}

    self.unredirected_hdrs = {}

    self._data = None

    self.data = data

    self._tunnel_host = None

    for key, value in headers.items():

    self.add_header(key, value)

    if origin_req_host is None:

    origin_req_host = request_host(self)

    self.origin_req_host = origin_req_host

    self.unverifiable = unverifiable

    if method:

    self.method = method

    pass

    我们可以这样使用(以下是模拟有道字典翻译发送的请求):619免费资源网

    # 请求地址url

    url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"

    # 请求头

    request_headers = {

    'Host':'fanyi.youdao.com',

    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36",

    }

    # 发送给服务器的表单

    form_data = {

    "i": word,

    "from": "AUTO",

    "to": "AUTO",

    "smartresult": "dict",

    "doctype": "json",

    "version": "2.1",

    "keyfrom": "fanyi.web",

    "action": "FY_BY_REALTIME",

    "typoResult": "false"

    }

    # POST发送的data必须为bytes或bytes类型的可迭代对象,不能是字符串

    form_data = urllib.parse.urlencode(form_data).encode()

    # 构造请求对象Request

    req = urllib.request.Request(url, data=form_data, headers=request_headers)

    # 发起请求

    response = urllib.request.urlopen(req)

    data = response.read().decode()

    print(data)

    所以,总的来说,如果我们在获取请求对象时,不需要过多的参数传递,我么可以直接选择urllib.request.urlopen();如果需要进一步的包装请求,则需要用urllib.request里。的urlopen()进行包装处理。619免费资源网

    展开全文
  • python中urllib.request和requests的使用和区别

    万次阅读 多人点赞 2019-03-06 15:53:45
    python中urllib.request和requests的使用和区别urllib.request发起一个简单的请求添加Headers信息requests urllib.request 我们都知道,urlopen()方法能发起最基本对的请求发起,但仅仅这些在我们的实际应用中一般都...

    python中urllib.request和requests的使用和区别

    urllib.request

    我们都知道,urlopen()方法能发起最基本对的请求发起,但仅仅这些在我们的实际应用中一般都是不够的,可能我们需要加入headers之类的参数,那需要用功能更为强大的Request类来构建了

    在不需要任何其他参数配置的时候,可直接通过urlopen()方法来发起一个简单的web请求

    发起一个简单的请求

    import urllib.request
    
    url='https://www.douban.com'
    
    webPage=urllib.request.urlopen(url)
    
    print(webPage)
    
    data=webPage.read()
    
    print(data)
    
    print(data.decode('utf-8'))
    

    urlopen()方法返回的是一个http.client.HTTPResponse对象,需要通过read()方法做进一步的处理。一般使用read()后,我们需要用decode()进行解码,通常为utf-8,经过这些步骤后,最终才获取到我们想要的网页。

    添加Headers信息

    import urllib.request
    
    url='https://www.douban.com'
    
    headers = {
         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
     }
     
    response=urllib.request.Request(url=url,headers=headers)
    
    webPage=urllib.request.urlopen(response)
    
    print(webPage.read().decode('utf-8'))
    

    使用Request类返回的又是一个urllib.request.Request对象了。
    通常我们爬取网页,在构造http请求的时候,都需要加上一些额外信息,什么Useragent,cookie等之类的信息,或者添加代理服务器。往往这些都是一些必要的反爬机制

    requests

    通常而言,在我们使用python爬虫时,更建议用requests库,因为requests比urllib更为便捷,requests可以直接构造get,post请求并发起,而urllib.request只能先构造get,post请求,再发起。

    import requests
    
    url='https://www.douban.com'
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
    }
    
    get_response = requests.get(url,headers=headers,params=None)
    
    post_response=requests.post(url,headers=headers,data=None,json=None)
    
    print(post_response)
    
    print(get_response.text)
    
    print(get_response.content)
    
    print(get_response.json)
    

    get_response.text得到的是str数据类型。
    get_response.content得到的是Bytes类型,需要进行解码。作用和get_response.text类似。
    get_response.json得到的是json数据。

    总而言之,requests是对urllib的进一步封装,因此在使用上显得更加的便捷,建议小伙伴们在实际应用当中尽量使用requests。

    欢迎大家来探讨python相关的知识!!!
    2470576197 这是我的qq

    展开全文
  • urllib.request和requests的使用和区别 请求网页内容可用urllib.request和requests函数,下面分别描述两种函数使用方法 urllib.request的使用 1.发起基础请求 import urllib.request req = urllib.request.Request...

    urllib.request和requests的使用和区别

    请求网页内容可用urllib.request和requests函数,下面分别描述两种函数使用方法

    urllib.request的使用

    1.发起基础请求

    import urllib.request
    req = urllib.request.Request(url)
    response = urllib.request.urlopen(req)
    print(response)
    

    返回结果如下:
    在这里插入图片描述
    返回的是一个object对象,如果想去获取内容还需进一步解析编码:

    import urllib.request
    req = urllib.request.Request(url)
    response = urllib.request.urlopen(req)
    content  = response.read().decode("utf-8")
    print(content)
    

    返回结果如下:
    在这里插入图片描述
    这个时候就是网页实际html内容,但是我们在获取网页内容,例如写爬虫时往往需要带上header头信息.

    2.发起带header的请求:

    url = "https://movie.douban.com"
    headers = {
        "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36"
    }
    
    req = urllib.request.Request(url=url,headers=headers)
    response = urllib.request.urlopen(req)
    content  = response.read().decode("utf-8")
    print(content)
    

    有时我们还需要更多的参数
    3.发起带有更多参数的请求头(以供参考):

    url = "https://movie.douban.com"
    headers = {
        "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36"
    }
    data = bytes(urllib.parse.urlencode({"hello":"world"}),encoding="utf-8")
    req = urllib.request.Request(url=url,data=data,headers=headers,method="POST")
    response = urllib.request.urlopen(req)
    content  = response.read().decode("utf-8")
    print(content)
    

    requests的使用

    requests的使用看起来就比较简单方便点
    1.发起请求:

    import requests
    url = "https://movie.douban.com"
    headers = {
        "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36"
    }
    
    req = requests.get(url=url, headers=headers)
    print(req)
    

    返回结果:
    在这里插入图片描述
    返回的是一个状态码,这个时候requests提供一些方法来获取结果
    1.req.text 得到的是str数据类型

    import requests
    url = "https://movie.douban.com"
    headers = {
        "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36"
    }
    
    req = requests.get(url=url, headers=headers)
    print(req.text)
    

    返回结果:
    在这里插入图片描述

    2.req.content 得到的是Bytes类型,需要进行解码。

    import requests
    url = "https://movie.douban.com"
    headers = {
        "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36"
    }
    
    req = requests.get(url=url, headers=headers)
    print(req.content)
    

    返回结果:
    在这里插入图片描述

    3.req.json 得到的是json数据

    import requests
    url = "https://movie.douban.com"
    headers = {
        "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36"
    }
    
    req = requests.get(url=url, headers=headers)
    print(req.json)
    

    返回结果:
    在这里插入图片描述

    展开全文
  • 主要介绍了python中urllib.request和requests的使用及区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • urllib.requests和requests都是爬虫中页面信息获取的方法。他们不仅在写法上和导入模块上存在区别,在用法上也不尽相同。
  • 文章目录两者间主要区别urllib.request导入方法内容requests导入方法内容两者间主要区别使用urllin内的request模块是,返回体获取有效信息请求体的拼接需要decodeencode后再进行装载。进行http请求时需先构造get...
  • 在学习python爬虫,想要检索request相关内容时,往往会出现urllib.request和requests这两个词,urllib.request和requests都是python爬虫的模块,其中urllib.request是urllib库模块的请求模块,主要用来打开或者读取...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 185
精华内容 74
关键字:

request和requests区别