python爬虫

Web请求过程

1、服务器渲染:在服务器那边直接把数据和html整合在一起,统一返回给浏览器

在页面源代码中能看到数据

2、客户端渲染:第一次请求只有一个html骨架,第二次请求拿到数据,进行数据展示(一般为XHR)

在页面源代码中看不到数据

<可用检查网页或者F12来查看>

 

HTTP协议

Hyper Text Transfer Protocol:超文本传输协议,从万维网(www:World Wide Web)服务器传输超文本到本地浏览器的传送协议

HTML(Hyper Text Makeup Language):超文本标记语言

HTTP对于请求和相应都把消息分为三个部分:( {}中表示在实际网页中的形式)

请求:

1、请求行:请求方式(get/post)、请求url地址、协议

{Request URL(在?前的是URL,在?后的是参数)、Request Method}

GET:一般用于查询东西(显式提交),请求方式一般是Query String Parameters(即在Request URL中?后的内容)

POST:一般用于修改东西(隐式提交),请求方式一般是Form Data

2、请求头:放一些服务器要求的附加信息(比如对数据的要求)

{Request Heads}(User-Agent(请求载体的身份标识)、Referer(防盗链)、Cookie(用户的登录状态))

3、请求体:放一些请求参数(比如搜索的内容)

相应:

1、状态行:协议、状态码(告诉我请求是否成功,比如200、404、500、302)

{Status code}

2、响应头:放一些客户端要求的附加信息(比如密钥)

{Response Heads}(Cookie、各种莫名其妙的字符串(一般都是token字样))

3、响应体:服务器返回的真正的客户端要用的内容(HTML、json)

 

一、re

import requests
import re

url = "https://movie.douban.com/top250"
headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"}  # 请求头
response = requests.get(url, headers=headers)
text = response.text
obj = re.compile(r"""<li>.*?<span class="title">(?P<name>.*?)</span>.*?<p class="">(?P<director>.*?)&nbsp;&nbsp;&nbsp;(?P<lead>.*?)...<br>(?P<time>.*?)&nbsp;/&nbsp;(?P<country>.*?)&nbsp;/&nbsp;(?P<type>.*?)\s\s\s.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>.*?<span>(?P<number>.*?)</span>.*?<span class="inq">(?P<quote>.*?)</span>""", re.S)
result = obj.finditer(text)  # 在text中查找obj(是一个Pattern对象),返回一个迭代器
for i in result:
    print(i.group("name"))  # group()用于分组
    print(i.group("director").strip())  # 去掉空格
    print(i.group("lead"))
    print(i.group("time").strip())
    print(i.group("country"))
    print(i.group("type"))
    print(i.group("score"))
    print(i.group("number"))
    print(i.group("quote"))
response.close()

 

结果为:

肖申克的救赎
导演: 弗兰克·德拉邦特 Frank Darabont
主演: 蒂姆·罗宾斯 Tim Robbins /
1994
美国
犯罪 剧情
9.7
2613829人评价
希望让人自由。
霸王别姬
导演: 陈凯歌 Kaige Chen
主演: 张国荣 Leslie Cheung / 张丰毅 Fengyi Zha
1993
中国大陆 中国香港
剧情 爱情 同性
9.6
1940678人评价
风华绝代。
……

详细介绍请看python正则表达式

 

二、BeautifulSoup

import requests
from bs4 import BeautifulSoup

url = "http://zhongdapeng.com/shucaijiage/831.html"
response = requests.get(url)
response.encoding = "utf-8"
text = response.text
# 先把页面源代码交给BeautifulSoup处理,生成bs对象
page = BeautifulSoup(text, "html.parser")  # 指定为html解析器(parser)
# 再从bs对象中查找数据:1、find(只找一个) 2、find_all 这两者后面都是(标签,属性=值),注意属性可能为python的关键字,比如class,那么就要写成class_=值或者attrs={"class":值}
table = page.find("table", attrs={"cellspacing": "0"})
trs = table.find_all("tr")[1:]  # 去掉第0个
for tr in trs:
    tds = tr.find_all("td")
    print(tds[1].text, tds[2].text, tds[4].text, tds[5].text)  # .text表示被标签标记的内容
response.close()

 

结果为:

意大利 
1.6-1.8 
香菜 
5.0-6.0

油麦菜 
1.7-1.7 
菠菜 
3.0-3.5

上青 
0.3-0.4 
茼蒿 
1.3-1.5
……

 

三、xpath

import requests
from lxml import etree
url = "https://search.jd.com/Search?keyword=iphone&enc=utf-8&wq=iphone&pvid=eb21f8da6aad40ccb455dd20c5ce52d4"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"}  # 请求头
response = requests.get(url, headers=headers)
response.encoding = "utf-8"
text = response.text
treeoject = etree.HTML(text)  # 解析html
# 根据xpath来提取元素
lis = treeoject.xpath("""/html/body/div[5]/div[2]/div[2]/div[1]/div/div[2]/ul/li""")
for li in lis:
    # /text()获取标签内的文本
    price = li.xpath("""./div/div[3]/strong/i/text()""")[0]
    description = "iPhone".join(li.xpath("""./div/div[4]/a/em/text()""")).strip()  # 去掉空格
    merchandiser = li.xpath("""./div/div[7]/span/a/text()""")[0]
    print(price)
    print(description)
    print(merchandiser)
    print("")
    # 可以用属性值索引:li[@class='…']/…
    # //li代表匹配所有的后代li节点,不论几代
    # ./代表从相对目录开始查找
    # *代表通配符
    # @用来提取属性值:li/@class
response.close()

 

结果为:

6098.00
Apple iPhone 13 (A2634) 128GB 星光色 支持移动联通电信5G 双卡双待手机【快充套装】
Apple产品京东自营旗舰店

3999.00
Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待
Apple产品京东自营旗舰店

5499.00
Apple iPhone 13 128GB 午夜色 支持移动联通电信5G 双卡双待手机
广州电信京东自营旗舰店
……

 

# Web请求过程
"""
1、服务器渲染:在服务器那边直接把数据和html整合在一起,统一返回给浏览器
在页面源代码中能看到数据
2、客户端渲染:第一次请求只有一个html骨架,第二次请求拿到数据,进行数据展示(一般为XHR)
在页面源代码中看不到数据
<可用检查网页或者F12来查看>
"""

# HTTP协议
"""
Hyper Text Transfer Protocol:超文本传输协议,从万维网(wwwWorld Wide Web)服务器传输超文本到本地浏览器的传送协议
HTML(Hyper Text Makeup Language):超文本标记语言
HTTP对于请求和相应都把消息分为三个部分: # {}中表示在实际网页中的形式
请求:
1、请求行:请求方式(get/post)、请求url地址、协议
{Request URL(在?前的是URL,在?后的是参数)Request Method}

GET:一般用于查询东西(显式提交),请求方式一般是Query String Parameters(即在Request URL中?后的内容)
POST:一般用于修改东西(隐式提交),请求方式一般是Form Data
2、请求头:放一些服务器要求的附加信息(比如对数据的要求)
{Request Heads}(User-Agent(请求载体的身份标识)Referer(防盗链)Cookie(用户的登录状态))
3、请求体:放一些请求参数(比如搜索的内容)
相应:
1、状态行:协议、状态码(告诉我请求是否成功,比如200404500302)
{Status code}
2、响应头:放一些客户端要求的附加信息(比如密钥)
{Response Heads}(Cookie、各种莫名其妙的字符串(一般都是token字样))
3、响应体:服务器返回的真正的客户端要用的内容(HTMLjson)
"""

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python爬虫 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • python命名空间和作用域

    命名空间是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的   命名空间查找顺序:局部命名空间、全局命名空间、内置命名空间   相同的对象名称可以存在于多个命名空间中   作用域就是一个可以直接访问命名空间的正文区域。程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了在哪一部分程序可以访问…

    Python开发 2023年4月2日
    00
  • python面向对象

    传统的结构化设计方法的基本点是面向过程,系统被分解成若干个过程。而面向对象的方法是采用构造模型的观点,在系统的开发过程中,各个步骤的共同的目标是建造一个问题域的模型。在面向对象的设计中,初始元素是对象,然后将具有共同特征的对象归纳成类,组织类之间的等级关系,构造类库。在应用时,在类库中选择相应的类 面向对象编程的主要思想是把构成问题的各个事务分解成各个对象,…

    Python开发 2023年4月2日
    00
  • python运算符

    算术运算符: + – * / % ** //   比较运算符: == != > < >= <=   赋值运算符: = += -= *= /= %= **= //= :=(海象运算符)   其中海象运算符用于在表达式内部为变量赋值: name = ‘大湘菜’ if n := len(name) < 4: print(‘a nice…

    Python开发 2023年4月2日
    00
  • python函数

    定义函数的一般格式: det function():   statements   return a return用于退出函数,向调用方返回一个表达式   函数可以不设置参数,也可以设置参数: def function1(): print(‘大湘菜’) def function2(a): print(a) function1() function2(‘小湘菜…

    Python开发 2023年4月2日
    00
  • python输入和输出

    输出 1、表达式语句 2、print() 3、write() 美化输出格式 repr()产生一个解释器易读的表达形式: a = ‘the sea has bank\nmy love is boundless’ print(a) print(repr(a)) # 可以转义特殊字符 结果为: the sea has bank my love is boundle…

    Python开发 2023年4月2日
    00
  • python迭代器和生成器

    iter()用于创建迭代器,next()用于输出迭代器的下一个元素: names = [‘微湘菜’, ‘小湘菜’, ‘大湘菜’, ‘巨湘菜’] iterName = iter(names) for i in range(4): print(next(iterName)) 结果为: 微湘菜 小湘菜 大湘菜 巨湘菜   创建一个迭代器需要在类中实现两个方法 __…

    Python开发 2023年4月2日
    00
  • 如何使用appnium爬取视频数据

    要先安装Appium,并用它来查找对应元素的id、xpath等信息   from appium import webdriver from appium.webdriver.extensions.android.nativekey import AndroidKey from selenium.webdriver.common.by import By im…

    Python开发 2023年4月2日
    00
  • 如何用html写书

    原理:利用xml.etree.ElementTree对html进行解析和写入 # encoding=utf-8import xml.etree.ElementTree as ET # 解析html、xmlname = input(‘type in file name:’)def circle(): tree = ET.parse(f'{name}.html’…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部