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>.*?) (?P<lead>.*?)...<br>(?P<time>.*?) / (?P<country>.*?) / (?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:超文本传输协议,从万维网(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)
"""
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python爬虫 - Python技术站